Java线程垃圾收集或不Java线程垃圾收集或不(Java Thread Garbage colle

2019-05-09 06:36发布

这个问题被张贴在一些网站。 我没有找到正确的答案,所以我在这里再次发布它。

public class TestThread {
    public static void main(String[] s) {
        // anonymous class extends Thread
        Thread t = new Thread() {
            public void run() {
                // infinite loop
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    // as long as this line printed out, you know it is alive.
                    System.out.println("thread is running...");
                }
            }
        };
        t.start(); // Line A
        t = null; // Line B
        // no more references for Thread t
        // another infinite loop
        while (true) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
            System.gc();
            System.out.println("Executed System.gc()");
        } // The program will run forever until you use ^C to stop it
    }
}

我的查询是不是停止线程。 让我重复我的问题。 A线(见上面的代码)开始一个新的线程; 和B线使线程参考空。 所以,现在JVM具有螺纹对象(其是处于运行状态),以其中不存在参考(如叔在线B = NULL)。 所以我的问题是,为什么这个线程(有没有参考了在主线程)继续运行,直到主线程运行。 按我的理解,线程对象应该是垃圾回收后线B.我想5分钟多,要求的Java Runtime运行GC运行这段代码,但线程只是不会停止。

希望双方的代码,问题很清楚这个时候。

Answer 1:

正在运行的线程被认为是所谓的垃圾收集根,是那些东西保存的东西被垃圾回收之一。 当垃圾回收器确定您的对象是否是“ 到达 ”与否,它总是这样使用集垃圾收集根作为参考点。

考虑这一点,为什么不是你的主线程垃圾回收,没有人要么引用的那一个。



Answer 2:

正如解释的,正在运行的线程,根据定义,不受GC。 在GC通过扫描的“根”,这被认为总是可达开始工作; 根包括全局变量(“静态字段”在Java的谈话)和所有正在运行的线程的堆栈(也可以想到的是,正在运行的线程的堆栈引用相应的Thread实例)。

但是,您可以让一个线程一个“守护”线程(见Thread.setDaemon(boolean) )。 守护线程不超过一个非守护线程垃圾回收,但是当所有正在运行的线程是守护进程的JVM退出。 想象它的一种方式是,每一个线程,终止时,检查是否有保持运行线程一些非守护; 如果不是,则终止线程强制System.exit()调用,退出JVM(杀死正在运行的守护线程)。 这不是GC相关的问题; 在某种程度上,线程手工分配。 然而,这是JVM如何容忍半流氓线程。 这通常是用于Timer的实例。



Answer 3:

JVM有所有正在运行的线程的参考。

没有线程(或它是指东西)将是垃圾收集,同时它仍在运行。



Answer 4:

线程是不是垃圾收集,因为有给,你不能看到线程引用。 例如,在运行时系统的引用。

在创建线程它被添加到当前线程组。 你可以得到当前线程组中线程的列表,所以这是另一种方式来获得对它的引用。



文章来源: Java Thread Garbage collected or not