JVM没有释放虚拟内存。

17 浏览
0 Comments

JVM没有释放虚拟内存。

我的网络应用程序正在抛出OOM错误。它被赋予了25GB的内存。应用程序已经被加载并测试过了,我们发现内存正在不断升高。但是我希望在完整的垃圾回收后JVM会释放内存。为什么即使应用程序被使用后,JVM仍然不释放虚拟内存?

以下是JVM设置:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/logs/gcc.log 
-XX:MaxPermSize=96m -XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode -XX:+UseCompressedOops -XX:+UseCompressedStrings
-Xmx30g

以下是“top”命令的输出:

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

以下是“free”命令的输出:

             total       used       free     shared    buffers     cached

Mem: 62167808 60855448 1312360 0 73592 17789532

-/+ buffers/cache: 42992324 19175484

Swap: 0 0 0

请提供任何解决此问题的线索。

admin 更改状态以发布 2023年5月21日
0
0 Comments

并不是所有的HotSpot JVM垃圾回收算法都会在垃圾回收后释放虚拟内存给操作系统。

能够执行该操作的有两种算法:

  • 串行算法 -XX:+UseSerialGC
  • G1算法 -XX:+UseG1GC

您正在使用的是CMS算法-XX:+UseConcMarkSweepGC,它永远不会释放内存给操作系统。

在这里,您可以找到所有HotSpot中的垃圾回收算法的快速概述。

0