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

京都盖饭小白领 2015-10-23 10:32:31
最近在学习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。
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 skgary 的回复:
其实是27-33的那个内部类的问题。。。。 和gc没什么关系。
没错 就是因为匿名内部类里有a.this
skgary 2015-10-23
  • 打赏
  • 举报
回复
其实是27-33的那个内部类的问题。。。。 和gc没什么关系。
skgary 2015-10-23
  • 打赏
  • 举报
回复
你用jvisualvm 看看啊。
  • 打赏
  • 举报
回复
我知道原因了,有会的过来领分呀

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧