Java的几种对象引用(Reference)

No.1   强引用      这个不用多说,就是最常见的对象引用。在GC时,只要不死无论如何都不会被回收,即使报OOM。

No.2   弱引用(WeakReference)      只要发生GC就被回收,不管是否存活。同样用于内存敏感的程序。WeakHashMap类中使用,在ThreadLocal类中有通过弱引用处理垃圾回收问题。使用方式与下面软引用相同。

No.3   软引用(SoftReference)         在堆空间不足时回收,即JVM 在抛出 OutOfMemoryError 之前,清理软引用指向的对象。

应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。用于高速缓存。例如Mybatis,radis底层就大量使用软引用。

 1 import java.lang.ref.SoftReference;
 2 
 3 public class ReferenceDemo {
 4     public static void main(String[] args) {
 5         Person p1=new Person();
 6         SoftReference<Person> softReference=new SoftReference(p1);
 7         System.out.println(softReference.get());
 8     }
 9 }
10 
11 class Person{
12     private String name;
13 }

No.4   虚引用  PhantomReference)

虚引用也叫幻象引用,通过PhantomReference类来实现。

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

无法通过虚引用访问对象的任何属性或函数。仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。

虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue);

程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。

如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取一些程序行动。

应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。 

 1 import java.lang.ref.ReferenceQueue;
 2 import java.lang.ref.SoftReference;
 3 import java.lang.ref.WeakReference;
 4 import java.util.WeakHashMap;
 5 
 6 public class ReferenceDemo {
 7     public static void main(String[] args) {
 8         Person p1=new Person();
 9         ReferenceQueue<Object> referenceQueue=new ReferenceQueue<>();
10         WeakReference<Person> weakReference=new WeakReference<>(p1,referenceQueue);
11         System.gc();
12         System.out.println(referenceQueue.poll());  //被回收后仍然可以在引用队列中取到
13     }
14 }
15 
16 class Person{
17     private String name;
18 }

 

posted @ 2020-03-06 19:12  codeFlyer  阅读(571)  评论(0编辑  收藏  举报