代码之家  ›  专栏  ›  技术社区  ›  savak

当对象持有对运行线程的引用时,它是否可以进行垃圾回收?

  •  2
  • savak  · 技术社区  · 9 年前

    1) 实际上,问题就在代码中。保持对运行线程的引用是否会阻止对象符合垃圾收集的条件?

    class SomeClass {
    
        Thread mThread = new Thread(new MyRunnable());
    
        public SomeClass() {
            mThread.start();
        } 
    
        public static void main(String[] args) {
            SomeClass sc = new SomeClass();
            sc = null;
            // Will the sc be eligible to gc here?
            ...
        }
    
        private static class MyRunnable implements Runnable {
            @Override
            public void run() {
                while (true) {} 
            }
        }
    }
    

    2) 如果我们对线程使用WeakReference而不是Thread,它是否符合资格?

    已更新

    更新了代码,以强调最令我困扰的问题。

    我想了解的是,运行线程的实例是否阻止对象被收集?

    1 回复  |  直到 9 年前
        1
  •  10
  •   John Bollinger    9 年前

    是否有资格进行垃圾收集取决于谁对 ,而不是你的推荐人。因此,是的,一个对象的实例变量包含对正在运行的 Thread 如果它本身无法从任何活动线程访问,则可以进行垃圾收集。事实上,在您的示例中,在您标记的行中就是这样。

    如果这样的对象 收集,这将对所讨论的线程没有影响。特别是,虚拟机本身包含着对每一个生命的引用 线 (即使它当前未运行),因此没有对 线 以防止其被收集。

    当然,保持对线程的弱引用也不会阻止对象被垃圾收集。