我的Web应用程序正在抛出OOM错误 . 它被给予25GB内存 . 应用程序已加载测试,我们看到内存正在增加 . 但我希望JVM在完全gc之后释放内存 . 为什么即使在使用应用程序之后JVM也没有释放虚拟内存 .
Here are the JVM settings:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/logs/gcc.log
-XX:MaxPermSize=96m -XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode -XX:+UseCompressedOops -XX:+UseCompressedStrings
-Xmx30g
Here is the "top" command output:
top - 02:09:42 up 117 days, 5:24, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 140 total, 1 running, 139 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 62167808k total, 60854992k used, 1312816k free, 73444k buffers
Swap: 0k total, 0k used, 0k free, 17789504k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17206 java 20 0 55.1g 40g 12m S 0.3 68.2 298:41.08 java
Here is the "free" command output:
total used free shared buffers cached
Mem: 62167808 60855448 1312360 0 73592 17789532
-/+ buffers/cache: 42992324 19175484
Swap: 0 0 0
请欣赏任何线索来解决此问题 .
1 回答
并非所有HotSpot JVM中的垃圾收集算法都会在GC之后将虚拟内存释放到操作系统 .
可以做到的两种算法是
serial
-XX:+UseSerialGC
G1
-XX:+UseG1GC
您正在使用CMS
-XX:+UseConcMarkSweepGC
,它永远不会向OS释放内存 .Here您可以在HotSpot中找到所有GC算法的快速摘要 .