错误:java.lang.OutOfMemoryError:无法创建新的本机线程:gemfire

时间:2016-10-27 07:00:59

标签: java memory memory-management windows-services gemfire

请在标记此重复之前阅读此内容:我已经完成了为此错误提供的所有答案,并且在我的方案中没有任何帮助。 我正在进行服务器迁移,其中同样的事情在32位和64位内存中运行良好。

我有一个Windows服务,内部指向生成java进程的.exe:我在.exe的配置文件中进行了所有可能的内存改进:下面: 我不确定是什么不同的行为导致64位服务器内存不足。(我的java版本是1.8.xx)

#Java Additional Parameters
wrapper.java.additional.1=-XX:+UseConcMarkSweepGC
wrapper.java.additional.2=-XX:+UseParNewGC
wrapper.java.additional.3=-XX:ParallelGCThreads=8
wrapper.java.additional.4=-verbose:gc
# wrapper.java.additional.!!! should be sequence !!!=-Xloggc:D:\apps\Logs\gc.log
# wrapper.java.additional.!!! should be sequence !!!=-XX:+PrintGCDetails
# wrapper.java.additional.!!! should be sequence !!!=-XX:+PrintGCTimeStamps
wrapper.java.additional.5=-XX:MaxDirectMemorySize=128m
wrapper.java.additional.6=-XX:+HeapDumpOnOutOfMemoryError
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=34001
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.10=-XX:CMSInitiatingOccupancyFraction=55
wrapper.java.additional.11=-XX:NewSize=474m
wrapper.java.additional.12=-XX:MaxNewSize=474m
#wrapper.java.additional.13=-XX:PermSize=128m
#wrapper.java.additional.14=-XX:MaxPermSize=128m
wrapper.java.additional.15=-Xss128k
wrapper.java.additional.16=-XX:+CMSIncrementalMode
wrapper.java.additional.17=-XX:+UseCompressedOops
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=1638
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=1638

仍然我最终会:

[严重2016/10/24 06:27:46.192 java.lang.OutOfMemoryError:无法创建新的本机线程 at java.lang.Thread.start0(Native Method)     在java.lang.Thread.start(未知来源)     在com.gemstone.gemfire.internal.SocketCreator.asyncClose(SocketCreator.java:688)

在这里读完概念:

Error reading

我对Java事情并不多,但是尝试了我所有的事情,对此的任何帮助都将受到高度赞赏,我花费了大量时间在此但却无法得出任何结论。

***********更新***************

所以基本上可以看出这个问题是由于Gemfire过度创建的线程超过了Gemfire Java Process的约800个线程。

这里Jconsole工具帮助计算了线程数,我可以看到来自不同池的大约200-300个线程被创建,除了通常的线程之外没有任何目的,并且它们具有以下描述:

Name: pool-9-thread-1
State: WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@163b285
Total blocked: 0  Total waited: 2

Stack trace: 
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(Unknown Source)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source) 

如果我能找到更多详情,我会添加更多细节!

*******更新2:************ 我可以使用Jconsole查看gemfire创建的所有线程: 并且这个数字一直在增加,并且在某段时间后我看到了OOM问题。我有什么方法可以阻止这种不必要的线程创建和内存消耗!

Plenty of thread pools

0 个答案:

没有答案