【发布时间】:2019-09-22 22:47:28
【问题描述】:
我在这里发现了很多关于我遇到的错误的问题,但没有一个解决方案对我有用。我希望这不被视为重复的问题。我正在使用用 Java 编写的数据分析软件工具,但出现以下错误:
[286.098s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.
Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
at java.base/java.lang.Thread.start0(Native Method)
at java.base/java.lang.Thread.start(Thread.java:803)
at edu.mit.compbio.ChromHMM.ChromHMM.trainParametersParallel(ChromHMM.java:9729)
at edu.mit.compbio.ChromHMM.ChromHMM.buildModel(ChromHMM.java:901)
at edu.mit.compbio.ChromHMM.ChromHMM.main(ChromHMM.java:12014)
我给 java 解释器的唯一参数是-Xmx10000M
我见过的大多数遇到此问题的人都试图创建大量线程,这就是他们问题的根源。但是这里的程序只是试图创建一个线程。我在计算集群上运行它,并在节点上请求了 128GB 的内存。据我了解,线程是在 Java 堆外的内存中创建的,所以应该还有 118GB 可用。我已经尝试过增加我给java的10000M大小的减少,但这并没有什么不同。我还添加了-Xss1000M 为线程提供更大的堆栈大小,但又得到了同样的错误。
我成功地用少量的输入数据运行了这个工具,并且只是开始在使用更大的数据集时遇到这个问题,我只是不知道要转动什么旋钮才能有足够的可用内存。我已经在顶部观看了该过程,它从未使用超过 10% 的可用内存,因此该内存在 Java 中的分配方式似乎存在一些问题。还有什么我可以尝试的吗,或者此时可能只是该工具需要进行不同的编码才能处理大量数据?
【问题讨论】:
-
你能检查你拥有的线程数吗?这通常是由启动过多线程引起的;您可能有一个错误导致您的代码启动的线程比您想象的要多。见stackoverflow.com/questions/1922290/…
-
我没有在顶部看到多个线程,但我不确定它们是显示在那里还是只显示单独的进程。我不知道怎么检查。
-
查看我发布的 SO 问题的链接,答案中有很多选项。
-
我尝试了“jconsole
”,但该命令刚刚挂起。其余所有选项都是 Java 方法。正如我在问题中所说,这是我在命令行上运行的工具,而不是我自己的代码,所以我必须获取该工具的源代码,花时间理解相当广泛的代码,所以我知道我需要在其中添加行以检查线程数,然后重新创建 jar 文件。
标签: java multithreading memory