new Thread() 对象什么时候被回收

在Java中什么样的对象会被回收呢?

  1. 通过引用计数判断不存在引用的对象。
  2. 通过遍历GC Root来判断不存在引用的对象。 假设有如下一段代码(推荐使用线程池):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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。

new Thread() 对象什么时候被回收

https://jingzhouzhao.github.io/archives/e6a5a040.html

作者

太阳当空赵先生

发布于

2018-12-18

更新于

2022-02-22

许可协议

评论