我搜索了有关此问题的帖子,但没有看到像我这样的情况。
我的 java 控制台显示错误消息"pool-1-thread-xxxx" java.lang.OutOfMemory
如下图:
我增加了内存6G
to 10G
,并设置-Xms=8G -Xmx=8G -Xmn=3G
in *.bat
在启动程序之前保存文件。我也一直在观察性能监视器,但内存总是在 20% 左右。我不知道怎么会发生这种事。任何想法?
这是我的run.bat
code.
@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)(超线程)
错误信息java.lang.OutOfMemoryError: unable to create new native thread
意思是
JVM 正在向操作系统和底层操作系统请求一个新线程
无法再分配新线程。
See OOM 解释 https://plumbr.io/blog/memory-leaks/understanding-java-lang-outofmemoryerror and 解释了您的具体情况 https://plumbr.io/outofmemoryerror/unable-to-create-new-native-thread.
因此,您不会在图表中看到高内存使用率,因为堆大小尚未接近其限制。
您必须检查应用程序代码并检查那里的线程池使用情况。没有源代码很难说什么,但可能有一些建议:
- 如果你使用
CachedThreadPoolExecutor
,那么提交的任务可能不够快,因此您的应用无法处理所有提交的任务。
- 您可以使用
FixedThreadPoolExecutor
与最大(Integer.MAX_VALUE
) 容量,在这种情况下,您必须限制池容量及其队列大小。所以池会吃掉所有可用的线程OOM
发生。
一般来说,您应该始终控制线程池配置并确保它不会占用所有系统资源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)