我发现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,混合模式)