2

与跟踪 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,混合模式)
4

0 回答 0