创建线程时出现 Java 内存不足错误



我在这里发现了很多关于我遇到的错误的问题,但没有一个解决方案对我有用。我希望这不算作重复的问题。我正在使用用 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中如何分配内存存在一些问题。还有什么我可以尝试的吗,或者此时可能只是需要对该工具进行不同的编码才能处理更多的数据?

我在 centOS/Red Hat 机器上遇到了同样的问题。 您正在达到用户、进程或总体限制的线程限制

就我而言,用户可以拥有的线程数是有限制的。可以检查,表示最大用户进程的

ulimit -a

您可以使用此命令查看正在运行的线程数

$ ps -elfT | wc -l

要获取进程正在运行的线程数(您可以使用 top 或 ps aux 获取进程 pid(:

$ ps -p <PROCESS_PID> -lfT | wc -l

/proc/sys/kernel/threads-max 文件提供了系统范围的线程数限制。根用户可以更改该值

要更改限制(在本例中为 4096 个线程(,请执行以下操作:

$ ulimit -u 4096

您可以在此处找到有关红帽/centOs http://www.mastertheboss.com/jboss-server/jboss-monitoring/how-to-solve-javalangoutofmemoryerror-unable-to-create-new-native-thread

的更多信息

最新更新