Java 中强引用, 软引用SoftReference,弱引用WeakReference,虚引用
Java当中的引用有四种:
1.强引用
平常我们用的最多的引用。 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。只有当分配的内存对象不再有任何引用时,GC才可能开始回收其内存。
<span style="font-size:18px;">1 A obj = new A(); 2 ..... 3 obj =null; 此时obj 可以被回收。 </span>
2.软引用SoftReference:
SoftReference常常被用于高速缓存cache,它的特点是,并不是你把它设成了null(对象不可达),GC就会回收它,而是只有当内存不足时,才去回收它! 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用WeakReference
实际上是一种“间接”引用,当我们希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference来记住此对象。
弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
<span style="font-size:18px;"> 1 A obj = new A(); 2 WeakReference wr = new WeakReference(obj); 3 obj = null; 4 5 //等待一段时间,obj对象就会被垃圾回收 6 ... 7 8 if (wr.get()==null) { 9 System.out.println("obj 已经被清除了 "); 10 } else { 11 System.out.println("obj 尚未被清除,其信息是 " obj.toString()); 12 }</span>