在Java中什么样的对象会被回收呢?
- 通过引用计数判断不存在引用的对象。
- 通过遍历GC Root来判断不存在引用的对象。
假设有如下一段代码(推荐使用线程池):
public void test(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
//do something
}
}
});
thread.start();
}
我们都知道,当test()方法退出时,调用栈中栈帧内局部变量表保存的局部变量(thread)都会被销毁。也就是说new Thread()的引用不存在了,但是执行GC后(测试可使用System.gc()),我们发现线程还是在运行的。
来看看线程的生命周期图(图片来源互联网):
从上图我们可以看到,只有当run方法结束时,线程才会dead。
猜测:在run方法中,其实会持有线程对象的this引用,也就是说,这个线程对象其实是存在GC Root 引用的,所以没有被GC。