Java进程内存使用偏离jcmd已提交的内存

时间:2017-12-01 10:26:44

标签: java memory memory-leaks jvm jcmd

我发现java进程(在docker中运行)的内存使用量存在很大差异,与jcmd跟踪JVM进程报告的内存使用情况相比。根据jcmd的JVM内存使用情况非常稳定,但ps(RSS)的内存使用量不断增长,大约是JVM提交的内存差异的两倍。 JVM差异是由小代码缓存增加和内部内存增加引起的。

问题:

  • 什么可能导致这种差异,如何跟踪它以修复根 原因?
  • 为什么内存使用量之间存在如此大的差异 由ps和JCMD承诺报告?

ps aux跟踪的内存将持续增加,直到内核OOM(我们使用内存软限制来延迟不可避免的OOM)。

例如: 时间点#1

  • ps aux RSS 2682980
  • JCMD本机内存跟踪:总计:保留= 3625201KB,已提交= 2423489KB

时间点#2

  • ps aux RSS 2775140
  • JCMD本机内存跟踪:总计:保留= 3627331KB,已提交= 2427371KB

其他细节:

  • 交换已停用
  • java.nio.BufferPool.MemoryUsed:10.3MB
  • JVM OPTS:-javaagent:/opt/newrelic/newrelic.jar -server -Xms1792m -Xmx1792m -XX:MetaspaceSize = 128M -XX:MaxMetaspaceSize = 192M -XX:+ UseG1GC -XX:+ UseStringDeduplication

某些版本:

  • Linux:amzn-ami-xxx-amazon-ecs-optimized
  • Docker版本:17.06.2-ce
  • java版“1.8.0_121”
  • Java(TM)SE运行时环境(版本1.8.0_121-b13)
  • Java HotSpot(TM)64位服务器VM(版本25.121-b13,混合模式)

0 个答案:

没有答案