与Linux VmRSS和Java NativeMemoryTraking(NMT)的总提交内存的区别



我尝试监视操作系统(Linux Ubuntu 19.04(分配给我的Java应用程序(OpenJDK 11.0.4(的总内存。

我采取两个方法:

  • 使用pscat /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 报告,如本答案中所述。

相关内容

  • 没有找到相关文章

最新更新