当前位置: 代码迷 >> J2SE >> JVM-哪位高手能看出来以下代码的A为什么没被回收掉
  详细解决方案

JVM-哪位高手能看出来以下代码的A为什么没被回收掉

热度:45   发布时间:2016-04-23 19:38:25.0
JVM高手请进---谁能看出来以下代码的A为什么没被回收掉
最近在学习JVM,了解到JVM中判断对象是否能被回收是根据根搜索方法判断的。
下面是我测试的一段代码,内容很简单,就是A生成一个局部变量,设置给B
按我的理解,A是可以被回收的,但结果不是。JVM大神帮忙看看吧。


public class GCTest {

public static void main(String[] args) throws InterruptedException {
new GCTest().test();
}

public void test() {
A a = new A();
B b = new B();
a.test(b);

a = null;
//b = null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}

class A {
byte[] bytes = new byte[10 * 1024 * 1024];

void test(B b) {
Callback c = new Callback() {

@Override
public void callback() {
}

};
b.setCallBack(c);

}

@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("A dead");
}
}

class B {
Callback c;

void setCallBack(Callback c) {
this.c = c;
}

}

interface Callback {
void callback();
}
}



控制台输出是:
[GC (System.gc())  12902K->10896K(125952K), 0.0049753 secs]
[Full GC (System.gc())  10896K->10749K(125952K), 0.0062311 secs]

如果设置了b=null,那么输出是:
[GC (System.gc())  12902K->10864K(125952K), 0.0046356 secs]
[Full GC (System.gc())  10864K->10749K(125952K), 0.0064800 secs]
A dead

这说明b引用到了a,可是我怎么看也不清楚,为什么b引用了a。

------解决思路----------------------
其实是27-33的那个内部类的问题。。。。

和gc没什么关系。
  相关解决方案