我搜索了有关此问题的帖子,但没有看到类似我的情况。
我的Java控制台在下面的图片中显示错误消息"pool-1-thread-xxxx" java.lang.OutOfMemory
:
我将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
答案 0 :(得分:3)
错误消息java.lang.OutOfMemoryError: unable to create new native thread
表示
JVM正在从操作系统和基础操作系统中请求新线程 无法再分配新线程。
请参见OOM explanations和your specific case explained。
因此,由于堆大小未接近其限制,因此您不会在图形中看到较高的内存使用情况。
您必须检查您的应用程序代码并检查那里的线程池使用情况。没有源代码很难说什么,但是可能没有什么建议:
CachedThreadPoolExecutor
,则提交的任务可能不够快,因此您的应用无法处理所有提交的任务。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
一个人也可以调整默认配置:
使用以下命令修改limits.conf文件:
sudo nano /etc/security/limits.conf
或在/etc/security/limit.d/
内部查看。
为运行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,这将大致相同。