【问题标题】:Too many Garbage collection threads垃圾回收线程过多
【发布时间】:2013-07-23 11:16:07
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么选择Dropbox而不是单纯的图片上传?在工作中,我们无法访问 Dropbox
  • @Karna:问题的图片上传仅在具有一定声誉的情况下可用。
  • 如果您在 Eclipse 中运行测试,有可能一些线程在失败的测试运行结束后仍然存在,因此是之前的测试运行遗留下来的。除了测试运行线程之外,您是否真的很小心地让所有线程都成为守护线程?

标签: java multithreading garbage-collection


【解决方案1】:

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

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

【讨论】:

  • 线程池绝对是前进的方向,它们响应更快,并防止因堆栈所需的大量分配而导致的本机(Java 堆外)碎片。
  • 是的,线程池更适合这项任务,但为什么创建许多线程会失败?
  • 感谢您的回答,我使用Executors.newCachedThreadPool() 重写了代码。我会让它运行一天。希望它成功:)
【解决方案2】:

我在 NetBeans 中遇到了类似的问题。一段时间后,程序会挂起很多(可能是 500 个)挂起的线程。但是,当在调试器外部运行时,它工作得很好。我认为我在户外运行时不会同时运行超过几百个线程,但是该程序确实倾向于以惊人的速度启动它们。我怀疑调试器从不关闭线程,只能处理这么多。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多