我尝试监视操作系统(Linux Ubuntu 19.04(分配给我的Java应用程序(OpenJDK 11.0.4(的总内存。
我采取两个方法:
- 使用
ps
或cat /proc/<pid>/status | grep VmRSS
中的 VmRSS 大小 - 使用具有以下属性的 Java NativeMemoryTracking 功能:
-XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
并使用总提交大小。
从两种方法检索到的数字总是不同的(有时只有几兆字节......有时更多(。
我的理解是,操作系统报告的 VmRSS 大小是进程使用的实际内存,但为什么 Java NTM 报告不同的值?
如果我希望能够监视 Java 应用程序的驻留集大小,我是否应该依赖操作系统报告的大小 (VmRSS( 我可以在 JVM 中使用某些东西(如 NTM(吗?理想情况下,我希望能够从自身监视我的 Java 应用程序的 RSS 大小......
NMT和RSS数字不同并不奇怪 - JVM和操作系统使用不同的方法来衡量不同的东西。
NMT 可以报告比实际使用情况少得多的内存,或者从操作系统的角度来看,它还可以报告比进程消耗的内存更多的内存。我在这个回答中解释了原因。
在 Java 应用程序中监控 RSS 很简单。你已经知道/proc/<pid>/status
,那么为什么不直接阅读Java代码中的/proc/self/status
呢?(Linux 会自动将self
映射到当前进程 ID(。解析/proc/self/stat
甚至更容易,因为所有信息都以预定义的格式在一行中提供。
也可以从 Java 应用程序中获取 NMT 报告,如本答案中所述。