为基于 JVM 的服务确定 docker 容器的尺寸非常棘手(众所周知)。我很确定我们稍微缩小了容器的尺寸,并想澄清一些与我们在监控时看到的特定 jcmd(本机内存跟踪器)输出有关的问题。
问题:
- jcmd 报告的“内部”中是否包含直接字节缓冲区?
- jcmd报告的“代码”中除了代码缓存之外还有什么?
- 有没有一种好方法来限制 jcmd 报告的“代码”部分。我阅读了https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm但这仅涵盖代码缓存限制,建议保留 JVM 默认值。
JCMD 输出在这里。
直接字节缓冲区JMX 属性在这里。
一些背景细节:
设置:
- 基于 Spring Boot 的应用程序
JVM 选项:
-server -Xms1792m -Xmx1792m -XX:MetaspaceSize=128M - XX:MaxMetaspaceSize=192M -XX:+UseG1GC -XX:+UseStringDeduplication - XX:MaxDirectMemorySize=256m -XX:NativeMemoryTracking=detail
- 在 AWS/EC2 中运行的 Docker 容器 2500MiB