垃圾收集线程太多

时间:2013-07-23 11:16:07

标签: java multithreading garbage-collection

我正在使用java开发一个软件,它在接收事件(来自传感器)时创建一个线程。这些线程的生存时间非常短(<1秒) 传感器发送最多10个事件/分钟。 这个程序在大多数时间都可以正常工作。但有一段时间它会挂起。
我看看eclipse调试器并发现有很多线程,其中大多数是"Thread[garbage collected]"(大约800个线程@ _ @)

我不知道该错误是否是由我的代码中的动态创建线程或其他错误引起的?

EDIT:
问题确实是由创建太多线程引起的。我已经记录了所有传感器的时间戳事件,并且它创建了一些关于1200 events/minute的点(该死的!)。 我还写了一个小的java程序,它创建了与posible一样多的线程。在~4100th thread(好吧,木制电脑),jvm崩溃了。它不像我的应用程序那样挂起: - ?
因此,我认为动态创建线程时可能存在(可能)罕见的情况并导致垃圾收集线程挂起?

enter image description here

2 个答案:

答案 0 :(得分:11)

不要为收到的每个事件创建新线程。相反,请使用java.util.concurrent包中的类。

创建ExecutorService(使用类Executors中的一个静态方法)并将用于处理事件的作业提交到ExecutorServiceExecutorService是一个为您管理线程的线程池。

答案 1 :(得分:1)

我在NetBeans中遇到了类似的问题。过了一会儿,程序会挂起很多(可能是500个)挂起的线程。但是,当在外部运行调试器时,它运行得很好。我不认为我在外面跑步的时候曾经有超过几百个线程在运行,但程序确实倾向于以激烈的速度启动它们。我怀疑调试器从不关闭一个线程,只能处理这么多。

到目前为止,我的经验是JVM很好地处理了大量快速启动和停止的线程,但NetBeans调试器(现在是几个版本,6个版本中的一个)没有。