与跟踪 JVM 进程的 jcmd 报告的内存使用情况相比,我看到 java 进程(在 docker 中运行)的内存使用情况存在很大差异。根据 jcmd 的 JVM 内存使用量非常稳定,但来自 ps (RSS) 的内存使用量不断增长,大约是 JVM 提交的内存差异的两倍。JVM 差异是由少量代码缓存增加和少量内部内存增加引起的。
问题:
- 什么会导致这种差异,我如何跟踪它以解决根本原因?
- 为什么 ps 报告的内存使用量和提交的 JCMD 之间存在如此大的差异?
ps aux 跟踪的内存将不断增加,直到内核 OOM(我们正在使用内存软限制来延迟不可避免的 OOM)。
例如:时间点#1
- ps辅助RSS 2682980
- JCMD Native Memory Tracking:总计:reserved=3625201KB,committed=2423489KB
时间点#2
- PS辅助RSS 2775140
- JCMD Native Memory Tracking:总计:reserved=3627331KB,committed=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 运行时环境 (build 1.8.0_121-b13)
- Java HotSpot(TM) 64 位服务器 VM(内部版本 25.121-b13,混合模式)