美文网首页
new Thread() 对象什么时候被回收呢?

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

作者: 赵荆州 | 来源:发表于2018-12-18 15:03 被阅读65次

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

  1. 通过引用计数判断不存在引用的对象。
  2. 通过遍历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。

相关文章

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

    在Java中什么样的对象会被回收呢? 通过引用计数判断不存在引用的对象。 通过遍历GC Root来判断不存在引用的...

  • 多线程系列01-线程的状态

    多线程状态图 新建状态(new),线程对象被创建后就进入了新建状态Thread th = new Thread()...

  • Thread 与 线程池Executors

    执行一个异步任务只会new Thread,结果被嘲笑了。查了一下弊端——. a. 每次new Thread新建对象...

  • Executors创建四种线程池

    1、new Thread的弊端 new Thread 弊端每次new Thread 新建对象性能差线程缺乏统一管理...

  • [并发] 6 线程池之ThreadPoolExecutor

    1.Thread使用 new Thread的弊端: 每次new Thread新建对象,性能差; 每次新建Threa...

  • Java多线程

    线程状态 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = ne...

  • JVM之内存回收算法

    概述 GC需要完成3件事情: 那些内粗需要回收 什么时候回收 如何回收 那么该如何判断对象已死,可以被回收呢? 引...

  • JAVA多线程

    线程的声明周期 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = n...

  • Java中静态成员变量初始化时机

    静态变量只有在类使用的时候 才会初始化,比如new 对象,使用静态变量等 什么时候静态变量回收呢?

  • Java的四种引用

    强引用:我们常常 new 出来的对象就是强引用类型,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存...

网友评论

      本文标题:new Thread() 对象什么时候被回收呢?

      本文链接:https://www.haomeiwen.com/subject/ayflkqtx.html