设定虚拟机参数:-Xmx20m,执行以下代码:
public class ReferenceTest {
@Test
public void test() {
SoftReference<byte[]> softReference = new SoftReference<>(new byte[1024 * 1024 * 10]);
System.out.println("软引用,gc前:" + softReference.get());
System.gc();
System.out.println("软引用,内存充足时gc后:" + softReference.get());
byte[] strongRef = new byte[1024 * 1024 * 10];
System.out.println("软引用,内存不足时gc后:" + softReference.get());
WeakReference<byte[]> weakReference = new WeakReference<byte[]>(new byte[1]);
System.out.println("弱引用,gc前:" + weakReference.get());
System.gc();
System.out.println("弱引用,gc后:" + weakReference.get());
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<byte[]> reference = new PhantomReference<byte[]>(strongRef, queue);
PhantomReference<byte[]> reference2 = new PhantomReference<byte[]>(strongRef, queue);
System.out.println("虚引用,gc前:" + queue.poll());
for (int i = 0; i < 100; i++) {
strongRef = new byte[1024 * 1024];
}
System.out.println("虚引用,gc后:" + queue.poll() + "、" + queue.poll());
}
}
执行结果:
软引用,gc前:[B@3d82c5f3
软引用,内存充足时gc后:[B@3d82c5f3
软引用,内存不足时gc后:null
弱引用,gc前:[B@2b05039f
弱引用,gc后:null
虚引用,gc前:null
虚引用,gc后:java.lang.ref.PhantomReference@61e717c2、java.lang.ref.PhantomReference@66cd51c3
虚引用特点:
1、无法阻止gc
2、无法通过虚引用来获取对一个对象的真实引用
3、必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现有虚引用指向它,就会在回收之前,把相关虚引用加入到与之关联的ReferenceQueue中