【问题标题】:Java out of memory error when creating thread创建线程时Java内存不足错误
【发布时间】: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


【解决方案1】:

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

就我而言,用户可以拥有的线程数是有限制的。可以检查哪一行,max user processes

ulimit -a

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

$ ps -elfT | wc -l

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

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

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

要更改限制(在本例中为 4096 个线程):

$ ulimit -u 4096

您可以在此处找到有关 Red Hat/centOs http://www.mastertheboss.com/jboss-server/jboss-monitoring/how-to-solve-javalangoutofmemoryerror-unable-to-create-new-native-thread 的更多信息

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多