我有一个看起来像这样的课程:
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
列表的内容会自发消失吗?例如。线程可以以某种方式停止,而没有任何显式代码调用某种清理逻辑。
(是的,我知道这是设计糟糕的代码,但它是遗留代码,我只是想在我尝试修复实现之前弄清楚当前发生了什么。)
答案 0 :(得分:1)
在高负载下,Java垃圾是否可能收集线程列表的内容?
不,不。
不,因为他们正在运行。正在运行的线程无法收集。
并且没有,因为存储在一个本身就是活着的列表中。
简单地说,GC永远不会拿走你以后想坐的椅子。
还有另一种方式,线程List的内容会自发消失吗?
没有。但是最重要的问题是缺失:
我做得对吗?
没有。标准方法是使用Executors
,它可以为您提供,例如使用newFixedThreadPool
。除非你有特殊要求和良好的专业知识,否则坚持下去。如果它们不能满足您的需求,甚至可以MoreExecutors。