java引用类型
分四种 想必大家都不陌生
强软弱虚
引用分优先级 依次是 强 软 弱 虚
强引用
java
中默认声明就是强引用例如Object o=new Object()
- 只要该对象强引用存在,垃圾回收器将永远不会回收被引用的对象,
JVM
即使程序抛出out of memory(内存溢出)
,GC
也不会回收 - 如果想要被
Gc
回收则需要手动将 强应用对象赋值为null
软引用
- 软引用是用来描述一些非必需但仍有用的对象,只有内存不足时才回收
- 在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常
java用softReference
来表示软引用- 示例
弱引用
-
弱引用的引用强度比软引用要更弱一些,
-
当
Gc
发现当前对象仅只有一个弱引用时,无论内存是否足够,只要进行垃圾回收,那些被弱引用关联的对象都会被回收,当时如果当前对象存在强引用或者软引用则不会被回收 -
java
用WeakReference
来表示弱引用-
示例
-
public static void main(String[] args){ // String 类型123 被强软弱引用 // 默认强引用 String str=new String("123"); // 软引用 SoftReference<String> softStr=new SoftReference<String>(str); // 弱引用 WeakReference<String> weakStr=new WeakReference<String>(str); System.out.println("强引用:"+str); System.out.println("软引用获取到的:"+softStr.get()); System.out.println("弱引用获取到的:"+weakStr.get()); //取消强引用 str=null; //取消软引用的引用链 // softStr.clear(); System.gc(); System.out.println("强引用:"+str); System.out.println("软引用:"+softStr.get()); System.out.println("弱引用:"+weakStr.get()); } /// 输出结果 强引用:123 软引用获取到的:123 弱引用获取到的:123 强引用:null 软引用:123 弱引用:123 /// 若取消软引用的引用链则输出 强引用:123 软引用获取到的:123 弱引用获取到的:123 强引用:null 软引用:null 弱引用:null
-
虚引用
-
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收
-
java用PhantomReference
来表示虚引用 -
主要功能用于检测对象有没有被引用,必须要配合
ReferenceQueue
来使用 -
看其源码
-
public class PhantomReference<T> extends Reference<T> { public T get() { return null; } public PhantomReference(T referent, ReferenceQueue<? super T> q) { super(referent, q); } }
-
内部仅有一个构造函数,和get方法且返回的是null
- 这说明我们无法从虚引用中获取对象
- 必须配合
ReferenceQueue
来使用
-
引用队列 ReferenceQueue
- 引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。
- 与软引用、弱引用不同,虚引用必须和引用队列一起使用。