今天在学习Java四大引用的知识,看到弱引用的描述是只要垃圾回收机制一运行,弱应用就会被回收。于是编写了以下测试代码(使用JDK1.8):
@Test
public void test1() throws Exception{
WeakReference<Integer> reference = new WeakReference<>(50);
System.out.println(reference.get());
System.gc();
System.out.println(reference.get());
}
打印结果如下:
50
50
看到这个结果有些懵,难道第二个不应该是null吗?然后我将Integer改为了Object,测试代码如下:
@Test
public void test2() throws Exception{
WeakReference<Object> reference = new WeakReference<>(new Object());
System.out.println(reference.get());
System.gc();
System.out.println(reference.get());
}
打印结果如下:
java.lang.Object@78e03bb5
null
就符合了弱引用的描述。
后来联想到Integer有一组-128–127的常量池,我将第一次的代码改为大于127的数字,例如999,gc一下就为null了。