列表中的对象是否会被垃圾回收?

时间:2014-06-24 15:20:42

标签: java garbage-collection

我有一个看起来像这样的课程:

public class MyClass() {
    private List<Thread> threads = new ArrayList<>();

    ...

    public MyClass() {
        for (int i = 0; i < 10 ; i++) {
            Thread t = new Thread();
            threads.add(t);
            t.start();
        }
    }
}

在我的服务中,有一个MyClass实例在服务运行期间挂起。通过JConsole,我观察到10个线程被创建并开始进行处理,所以我知道这个设置在某种程度上有效。

当系统负载不足时,我的问题出现了。当我向服务发送数千个大对象时,上述线程自发死亡。 (正如我在JConsole中观察到的那样。)由于没有定义逻辑来实际拆除线程和/或清除threads列表,我想知道Java是否有可能从垃圾收集内部实际对象threads列出并留下了某种弱引用。

问题:

  • 在负载很重的情况下,Java垃圾是否可能收集threads列表的内容?

  • 还有另一种方式threads列表的内容会自发消失吗?例如。线程可以以某种方式停止,而没有任何显式代码调用某种清理逻辑。

(是的,我知道这是设计糟糕的代码,但它是遗留代码,我只是想在我尝试修复实现之前弄清楚当前发生了什么。)

1 个答案:

答案 0 :(得分:1)

  

在高负载下,Java垃圾是否可能收集线程列表的内容?

不,不。

不,因为他们正在运行。正在运行的线程无法收集。

并且没有,因为存储在一个本身就是活着的列表中。

简单地说,GC永远不会拿走你以后想坐的椅子。

  

还有另一种方式,线程List的内容会自发消失吗?

没有。但是最重​​要的问题是缺失:

  

我做得对吗?

没有。标准方法是使用Executors,它可以为您提供,例如使用newFixedThreadPool。除非你有特殊要求和良好的专业知识,否则坚持下去。如果它们不能满足您的需求,甚至可以MoreExecutors