如何解决Java错误“pool-1-thread-xxxx”java.lang.OutOfMemory

问题描述 投票:0回答:2

我已经搜索了关于这个问题的帖子,但我没有看到像我这样的情况。

我的java控制台显示错误消息qazxsw poi如下图:

"pool-1-thread-xxxx" java.lang.OutOfMemory

pool-1-thread-OutOfMemoryError issuse

  • 红线:CPU使用率
  • 绿线:内存使用情况

我已经将performance monitor的RAM增加到6G,并在启动程序之前在10G文件中设置-Xms=8G -Xmx=8G -Xmn=3G。我也一直在观看性能监视器,但内存总是在20%左右。我不知道怎么会发生这种情况。任何的想法?

这是我的*.bat代码。

run.bat
  • 操作系统:Windows Server 2012 R2
  • Java版本:jre1.8.0_171
  • RAM:10G
  • CPU:2.5 GHz Intel Xeon(R)(超线程)
java out-of-memory threadpool
2个回答
3
投票

错误消息@echo off javapro @java -Xoptimize -Xms8G -Xmx8G -Xmn3G -Xss1024k -XX:+UseConcMarkSweepGC -cp javaPro.exe; cls run.bat 意味着

JVM要求来自操作系统的新线程,底层操作系统不能再分配新线程。

java.lang.OutOfMemoryError: unable to create new native threadOOM explanations

因此,您不会在图中看到高内存使用量,因为堆大小未接近其限制。

您必须检查您的应用程序代码并检查那里的线程池使用情况。没有源代码很难说什么,但可能没有什么建议:

  1. 如果您使用your specific case explained,则提交的任务可能不够快,因此您的应用无法处理所有提交的任务。
  2. 您可以使用具有最大(CachedThreadPoolExecutor)容量的FixedThreadPoolExecutor,在这种情况下,您必须限制池容量及其队列大小。因此,池会吃掉所有可用的线程,并且会发生Integer.MAX_VALUE

通常,您应始终控制线程池配置,并确保它不会占用所有系统资源。


2
投票

认为我找到了可能的原因/解决方案方法:

可以使用OOM检查进程的软限制:

ulimit -a

为了改变这些值:

$ cat /proc/22666/limits | grep processes
Max processes             1024                 62265                processes 

$ ulimit -a | grep processes
max user processes   

还可以调整默认配置:

  1. 使用以下命令修改$ ulimit -Su 2000 $ ulimit -a | grep processes max user processes (-u) 2000 $ cat /proc/22666/limits | grep processes Max processes 2000 文件:
  2. limits.conf或者看看sudo nano /etc/security/limits.conf
  3. 为运行/etc/security/limit.d/的用户添加以下内容。

limits.conf中

java

然后使用以下命令修改#<domain> <type> <item> <value> # adjust these values as needed: someuser soft nofile 4096 someuser hard nofile 8192 文件:

common-session

添加以下行:

普通会话

sudo nano /etc/pam.d/common-session

并重启java。

对于Windows 2012 Server,这将大致相同。

© www.soinside.com 2019 - 2024. All rights reserved.