当前位置: 首页 > 面试题库 >

是否收集Java线程垃圾

郎翔
2023-03-14
问题内容

该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。

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行(请参见上面的代码)启动一个新html" target="_blank">线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线程对象应该已经在B行之后被垃圾回收了。我尝试将这段代码运行5分钟或更长时间,请求Java Runtime运行GC,但是线程不会停止。

希望这次代码和问题都清楚。


问题答案:

正在运行的线程被认为是所谓的垃圾回收根,并且是防止东西被垃圾回收的其中一种。当垃圾收集器确定您的对象是否“ 可达 ”时,它总是使用垃圾收集器根集合作为参考点来这样做。

考虑这一点,为什么您的主线程没有被垃圾回收,也没有人引用那个线程。



 类似资料:
  • 问题内容: 我知道当分配DirectbyteBuffer时,它不受垃圾回收的限制,但是我想知道的是 包装 对象是否被垃圾回收了。 例如,如果我分配了一个新的DirectByteBuffer dbb,然后使用dbb.duplicate()将其复制(浅复制),则我将在同一块内存中使用两个包装器。 这些包装器是否要进行垃圾收集?如果我做了 我最终会自己OOM吗? 问题答案: 在Sun JDK中,由创建的

  • 问题内容: Java垃圾收集器以优先级1运行,因此不能保证System.gc()如果被调用将实际执行。 有什么办法可以改变其优先级?如果需要,这将使我能够运行。 问题答案: 垃圾收集器是一个独立线程(如TomHawtin在评论中所提醒,甚至不一定是单个线程),并且其优先级由Java虚拟机确定。这意味着您不能强制垃圾回收。调用告诉运行时环境“现在”可能是运行GC的好时机,但实际上并不能保证立即进行垃

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • 这是一个内存数据安全问题。 java垃圾收集是否安全地清除垃圾数据? 显然,在一个数据块被垃圾收集后,我不能再检索它了,但黑客还能通过内存转储来检索数据吗?

  • 问题内容: 我已经读过,Perm gen(或Permanent Generation)空间不是垃圾收集的。但是,在CMS集合中,我可以在GC日志中看到一些正在卸载的类。那么,在完全收集或CMS收集期间是否会收集烫发垃圾? 问题答案: PermGen像堆的其他部分一样被垃圾收集。 这里要注意的是PermGen包含类和对象的元数据,即指向分配对象的堆其余部分的指针。PermGen还包含类加载器,在使用

  • 有人能给我解释一下原因吗?