最近招人,要求不高,所以面试的时候,我问了道基础题:
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());
}
}
控制台上输出什么?为什么?
开放性问题:如果让虚拟机的垃圾回收更有效率?