强引用:最常见的,不会被GC回收的对象,如 Object obj = new Object();
软引用:可有可无的对象,如果内存空间足够,GC就不会去回收这个对象,如果内存不足,就会回收,软引用可有和ReferenceQueue(引用队列)联合使用,如果软引用所引用的对象呗GC回收,JVM就会把这个软引用加入到引用队列中。
@Test
public void test() throws InterruptedException {
Object obj=new Object();
ReferenceQueue refQueue = new ReferenceQueue();
SoftReference softRef = new SoftReference(obj, refQueue);
System.out.println(softRef.get());
obj=null;
System.gc();
Thread.sleep(200);
System.out.println(softRef.get());
System.out.println(refQueue.poll());
}
弱引用:也是描述可有可无的对象,和软引用不同的是,它的生命周期更短,在GC的过程中,一旦发现有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。 真是因为这个特性,所以弱引用常用于Map数据结构中,引用占用空间内存较大的对象
@Test
public void testWeakRef() throws InterruptedException {
Object obj=new Object();
ReferenceQueue refQueue = new ReferenceQueue();
WeakReference weakRef = new WeakReference(obj, refQueue);
System.out.println(weakRef.get());
obj=null;
System.gc();
Thread.sleep(200);
System.out.println(weakRef.get());
System.out.println(refQueue.poll());
}
发现使用弱引用,及时内存够用,在一次gc后也被回收了
虚引用:也成幽灵引用,他的构造方法必须传递RefenceQueue参数,当GC准备回收一个对象时,发现它还有虚引用,就会在回收前,把虚引用加入到引用队列中,程序可以通过判断队列中是否加入虚引用来判断被引用的对象是否将要GC回收,从而可以在finalize方法中采取措施。
如果不研究ReferenceQueue,那么虚引用将没有任何作用、弱引用的效果将大打折扣。在软引用、弱引用和虚引用的构造器中我们都可以添加ReferenceQueue参数,将他们与一个引用队列关联起来。那么在程序运行的过程中,ReferenceQueue在检测到适当更改后,gc会将已注册回收的引用对象添加到该队列中。
网友评论