java 相互引用 gc,Java引用和GC关系的面试题

最近招人,要求不高,所以面试的时候,我问了道基础题:

private Map cacheDemo=new HashMap();

public void  testWeak() throws Throwable {

Option op1 = new Option();

op1.setContent("face book");

Map cacheDemo = new HashMap();

WeakReference wk1 = new WeakReference(op1);

cacheDemo.put("test", wk1);

Thread.sleep(10000);

op1 = null;

System.gc();

WeakReference ks = (WeakReference) cacheDemo.get("test");

assertNotNull(ks);

if (ks.get() == null) {

assertNull(ks.get());

} else {

System.out.println(((Option) ks.get()).getContent());

}

}

问:最后控制台上会输出什么?为什么?

改一下,继续:

public void  testWeak() throws Throwable {

Option op1 = new Option();

op1.setContent("face book");

Map cacheDemo = new HashMap();

WeakReference wk1 = new WeakReference(op1);

cacheDemo.put("test", wk1);

Thread.sleep(10000);

check(op1);

System.gc();

WeakReference ks = (WeakReference) cacheDemo.get("test");

assertNotNull(ks);

if (ks.get() == null) {

assertNull(ks.get());

} else {

System.out.println(((Option) ks.get()).getContent());

}

}

private void  check(Option op){

op=null;

Option op2=new Option();

op2.setContent("my book");

op=op2;

}

控制台上又会输出什么?为什么?

再改一下:

public void  testWeak() throws Throwable {

Option op1 = new Option();

op1.setContent("face book");

Map cacheDemo = new HashMap();

WeakReference wk1 = new WeakReference(op1);

cacheDemo.put("test", wk1);

cacheDemo.put("face", op1);

Thread.sleep(10000);

op1 = null;

System.gc();

WeakReference ks = (WeakReference) cacheDemo.get("test");

assertNotNull(ks);

if (ks.get() == null) {

assertNull(ks.get());

} else {

System.out.println(((Option) ks.get()).getContent());

}

}

控制台上输出什么?为什么?

开放性问题:如果让虚拟机的垃圾回收更有效率?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值