一个尚未启动的新线程对象会被垃圾回收吗?

Posted

技术标签:

【中文标题】一个尚未启动的新线程对象会被垃圾回收吗?【英文标题】:A new thread object that has not been started will be garbage collected? 【发布时间】:2015-11-13 11:09:47 【问题描述】:

我有来自 Java 虚拟机的源代码。这个虚拟机只有满足这些条件(两个条件)的垃圾收集线程:

线程已完成(开始完成) 线程对象没有任何引用

我认为它应该用 no refence 垃圾收集 未启动的线程。但是这些线程被保存在 VM 内存中。对吗?


示例代码:

public class Test implements Runnable

    private Thread thread;
    public Test() 
        thread = new Thread(this);
        

    @Override
    public void run() 
        //This thread never runs...
        //My question is about garbage collector in a situation like this...
        

考虑:

测试对象不再有引用 Test 对象线程从未启动

测试线程会被垃圾回收吗?

【问题讨论】:

我正在创建一个虚拟机,所以我需要了解这个概念。出于这个原因,我在这里寻求帮助:) Thread 实例不是真正的线程,它是控制线程的api。一旦有一个正在运行的线程,您的 Thread 对象将被“从线程”引用,并且在这种情况下不能被 GC。 【参考方案1】:

ThreadRunnable 类的实例类似于任何其他类的实例。所以,是的,如果引用超出范围,它将被 GCed。

注意:您首先必须创建一个Test 的实例。

running 线程作为 GC 的根,不会被 GC。它启动线程(通过调用start(),它实际上创建了一个执行线程并使它变得特别。

【讨论】:

@GabrielDias - 未启动的线程与任何其他对象一样,将以这种方式进行 GC。 正在执行的线程不会被 GC,因为正在运行的线程将充当 GC 根

以上是关于一个尚未启动的新线程对象会被垃圾回收吗?的主要内容,如果未能解决你的问题,请参考以下文章

GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?

java 怎么对一个对象强制垃圾回收

Java垃圾回收机制简要总结

Java 的垃圾回收如何判断哪个对象可以被回收

各种垃圾回收 (转)

jvm学习笔记一(垃圾回收算法)