我已经搜索了关于这个问题的帖子,但我没有看到像我这样的情况。
我的java控制台显示错误消息qazxsw poi如下图:
"pool-1-thread-xxxx" java.lang.OutOfMemory
我已经将的RAM增加到6G
,并在启动程序之前在10G
文件中设置-Xms=8G -Xmx=8G -Xmn=3G
。我也一直在观看性能监视器,但内存总是在20%左右。我不知道怎么会发生这种情况。任何的想法?
这是我的*.bat
代码。
run.bat
错误消息@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 thread
和OOM explanations。
因此,您不会在图中看到高内存使用量,因为堆大小未接近其限制。
您必须检查您的应用程序代码并检查那里的线程池使用情况。没有源代码很难说什么,但可能没有什么建议:
CachedThreadPoolExecutor
)容量的FixedThreadPoolExecutor
,在这种情况下,您必须限制池容量及其队列大小。因此,池会吃掉所有可用的线程,并且会发生Integer.MAX_VALUE
。通常,您应始终控制线程池配置,并确保它不会占用所有系统资源。
认为我找到了可能的原因/解决方案方法:
可以使用OOM
检查进程的软限制:
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
文件:sudo nano /etc/security/limits.conf
。/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。
session required pam_limits.so
......对于Windows 2012 Server,这将大致相同。