请在标记此重复之前阅读此内容:我已经完成了为此错误提供的所有答案,并且在我的方案中没有任何帮助。 我正在进行服务器迁移,其中同样的事情在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)
在这里读完概念:
我对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问题。我有什么方法可以阻止这种不必要的线程创建和内存消耗!