java四种引用类型
我们知道在java中引用也是一种数据类型,需要在stack中申请内存来保存引用,这点类似C语言中的指针,还不知道什么是引用的推荐这篇博客java值类型和引用类型。
java对象的引用分为四种:强引用、软引用、弱引用、虚引用
java提供不同引用类型的目的有两个:
1,让程序员可以通过代码决定对象的生命周期。
2,利于JVM进行垃圾回收。
一,分别用一句话总结四种引用的异同
1,强引用
具有强引用的对象在整个生命周期内永远不会被回收。
2,软引用
在内存不足,即抛出OutOfMemoryError前会被回收,可以和引用队列(ReferenceQueue)联合使用。
3,弱引用
只具有弱引用的对象,不管当前内存空间足够与否,都会被回收,可以和引用队列(ReferenceQueue)联合使用。
4,虚引用
任何时候都可能被回收,必须和引用队列(ReferenceQueue)联合使用,主要用来跟踪对象被垃圾回收器回收的活动
二,四种类型详解
1,强引用
这是最常用的引用类型,我们平时声明的变量名都是强引用类型,Object o=new Object()
,这里的o就是一个强引用类型,o所指向的对象,也就是new Object()操作后被分配在heap中的一块内存区域永远不会被回收,因为有强引用类型o来指向它。
Question:被强引用的对象在整个程序声明周期内都不会被回收?
Answer:当然不是,被强引用的对象也是会被回收的,有以下两种情况:
1,主动切断对对象的强引用,即将引用赋值为null,Object o=new Object();o=null;
,这样赋值为null后,在JVM进行gc时jiu会回收该对象,当然如果有多个强引用指向该对象,就需要都赋值为null,如下:
Object o=new Object();
Object o1=o;
Object o2=o;
//将引用o,o1,o2都赋值为null
o=null;
o1==null;
o2=null;
2,软引用
如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;软可及对象的清理是由垃圾收集线程根据其特定算法按照内存需求决定的。
“如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。“怎么理解这句话?看下面的例子:
Object o=new Object();
SoftReference sr=new SoftReference(o);
o=null;
Object oo=sr.get();
这里的oo是一个强引用,也就是说,sr虽然是一个软引用,但却能get()一个强引用。
3,弱引用
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。
ReferenceQueue<String> queue = new ReferenceQueue<String>();
WeakReference<String> pr = new WeakReference<String>(new String("hello"), queue);
4,虚引用
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
三,不同引用的应用
1,用软引用和弱引用解决OOM问题
2,软引用的get()再获取对象实现java对象告诉缓存
3,弱引用保护敏感数据