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

时间:2018-08-21 09:09:07

标签: java out-of-memory threadpool

我搜索了有关此问题的帖子,但没有看到类似我的情况。

我的Java控制台在下面的图片中显示错误消息"pool-1-thread-xxxx" java.lang.OutOfMemory

pool-1-thread-OutOfMemoryError issuse

performance monitor

  • 红线:CPU使用率
  • 绿线:内存使用量

我将RAM从6G增加到10G,并在启动程序之前在-Xms=8G -Xmx=8G -Xmn=3G文件中设置了*.bat。我也一直在观察性能监视器,但内存始终在20%左右。我不知道这怎么会发生。有想法吗?

这是我的run.bat代码。

@echo off 
javapro @java -Xoptimize -Xms8G -Xmx8G -Xmn3G -Xss1024k -XX:+UseConcMarkSweepGC -cp javaPro.exe;
cls
run.bat
  • 操作系统:Windows Server 2012 R2
  • Java版本:jre1.8.0_171
  • RAM:10G
  • CPU:2.5 GHz Intel Xeon(R)(超线程)

2 个答案:

答案 0 :(得分:3)

错误消息java.lang.OutOfMemoryError: unable to create new native thread表示

  

JVM正在从操作系统和基础操作系统中请求新线程   无法再分配新线程。

请参见OOM explanationsyour specific case explained

因此,由于堆大小未接近其限制,因此您不会在图形中看到较高的内存使用情况。

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

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

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

答案 1 :(得分:2)

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

一个人可以检查使用ulimit -a的进程的软限制:

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

$ ulimit -a | grep processes
max user processes   

为了更改这些值:

$ ulimit -Su 2000

$ ulimit -a | grep processes
max user processes (-u) 2000

$ cat /proc/22666/limits | grep processes
Max processes 2000 

一个人也可以调整默认配置:

  1. 使用以下命令修改limits.conf文件:

  2. sudo nano /etc/security/limits.conf或在/etc/security/limit.d/内部查看。

  3. 为运行java的用户添加以下内容。

limits.conf

#<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

添加以下行:

常见会话

session required pam_limits.so

然后重新启动Java。

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