今天在学习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了。