java中的四种引用类型

Java有四种引用类型,strongreference,softreference,weakreference,phantomreference。这四种引用的强度按照上面的顺序依次减弱,下面通过几个例子简单了解一下这四种引用类型。

StrongReference

这个不用多讲了,这是 java 默认的引用类型,如果不特意使用 java.lang.ref 下的类,那么程序中的所有引用都是强引用。有强引用存在的对象永远都不会被 gc 收集,所以在内存不够用时,JVM 宁愿抛出 OutOfMemoryError 这样的错误,也不愿意将强引用对象进行回收。

一般人的不知道的Java 的四种引用类型

 

SoftReference

软引用不会保证对象一定不会被回收,只能最大可能保证。如果内存有剩余,那么软引用对象不会被回收,如果内存不足,那么 gc 会回收软引用对象。所以这种特性可以用来实现缓存技术。软引用要用 java.lang.ref.SoftReference 来实现。

一般人的不知道的Java 的四种引用类型

 

WeakReference

除了通过 java.lang.ref.WeakReference 来使用弱引用,WeakHashMap 同样也利用了弱引用。和软引用不同的是,弱引用一定会被 gc 回收,不管内存是否不足。

一般人的不知道的Java 的四种引用类型

 

PhantomReference

幽灵引用,也叫虚引用。java.lang.ref.PhantomReference 类中只有一个方法 get(),而且几乎没有实现,只是返回 null。而且这个类只有一个构造器 ( 软引用和弱引用均有两个构造器): 也就是说,幽灵引用只能与 ReferenceQueue(后面会提到这个类)一起使用。如果一个对象仅有幽灵引用,那么它就像没有任何引用一样,在任何时候都可能被 gc 回收。幽灵引用主要用来跟踪对象被垃圾回收的活动。ReferenceQueue 如果一个对象只有软引用、弱引用或者幽灵引用,gc 在回收对象时,JVM 会自动将其引用放入一个 ReferenceQueue 中。WeakHashMap 就是利用了 ReferenceQueue 来实现清除没有强引用 Entry 的。将上面的弱引用例子稍微改一下:

一般人的不知道的Java 的四种引用类型

Java

注意,运行这个程序需要用 debug 模式进行调试,在上面说明的地方加个断点。如果直接运行,结果很可能只是个 null,用 debug 调试的话会看到输出的是弱引用的地址。程序输出的 sf 结果和 rq.poll() 结果相同。

 

一、强引用(StrongReference):相当于生活中的必需品,平时接触最多,不会被GC回收。当内存空间不足时,java虚拟机宁愿抛出OutOfMemoryEerror异常,也不愿意回收强引用对象来解决内存不足的问题。

二、弱引用(WeakReference) : 相当于可有可无的生活品。在垃圾回收线程扫描它所管理的内存区域的过程中,一旦发现只具有弱引用的对象,不管当前内存足够与否,都会回收它的内存。弱引用可以和一个引用队列联合使用,如果弱引用所引用的对象被垃圾回收机制回收,java虚拟机会把这个弱引用加到与之关联的引用队列中。强引用与弱引用的区别在于:只具有弱引用的对象具有更短的生命周期。

三、软引用(SoftReference):相当于可有可无的生活品。如果空间内存足够,垃圾回收器就不会回收它,如果内存不够,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可以和一个引用队列联合使用,如果软引用的对象被垃圾回收,java虚拟机就会把这个软引用加入到与之关联的引用队列中。

四、虚引用(PhantomReference): 虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与弱引用、软引用的区别在于:虚引用必须和引用队列联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象之前,将虚引用加入到关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收机制回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收 前采取必要的行动。常常使用虚引用来完成对象回收前的资源释放工作。

引用地址:https://blog.csdn.net/u011277123/article/details/78830391

引用地址:https://blog.csdn.net/bingogirl/article/details/51697067

你可能感兴趣的:(java中的四种引用类型)