与 Linux VmRSS 和 Java NativeMemoryTracking (NMT) 的总提交内存的区别
Difference with Linux VmRSS and the total commited memory of Java NativeMemoryTraking (NMT)
我尝试监控 OS(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
并使用总提交大小。
从这两种方法中检索到的数字总是不同的(有时几兆字节......有时更多)。
据我了解,OS 报告的 VmRSS 大小是进程使用的实际内存,但为什么 Java NTM 报告的值不同?
如果我希望能够监视 Java 应用程序的驻留集大小,我是否应该依赖 OS 报告的大小 (VmRSS) 是否可以使用 JVM 中的某些内容 (像 NTM)?理想情况下,我希望能够从自身监控我的 Java 应用程序的 RSS 大小 ...
NMT 和 RSS 数字不同并不奇怪 -- JVM 和 OS 使用不同的方法来衡量不同的事物。
NMT 可以报告 much less memory than the actual usage, or it can also report memory than the process consumes from the OS perspective. I explained the reasons in 。
在 Java 应用程序中监控 RSS 很简单。您已经了解 /proc/<pid>/status
,那么为什么不直接阅读 Java 代码中的 /proc/self/status
? (Linux 自动将 self
映射到当前进程 ID)。解析 /proc/self/stat
更容易,因为所有信息都以预定义格式在一行中提供。
也可以从 Java 应用程序中获取 NMT 报告,如 this answer 中所述。
我尝试监控 OS(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
并使用总提交大小。
从这两种方法中检索到的数字总是不同的(有时几兆字节......有时更多)。
据我了解,OS 报告的 VmRSS 大小是进程使用的实际内存,但为什么 Java NTM 报告的值不同?
如果我希望能够监视 Java 应用程序的驻留集大小,我是否应该依赖 OS 报告的大小 (VmRSS) 是否可以使用 JVM 中的某些内容 (像 NTM)?理想情况下,我希望能够从自身监控我的 Java 应用程序的 RSS 大小 ...
NMT 和 RSS 数字不同并不奇怪 -- JVM 和 OS 使用不同的方法来衡量不同的事物。
NMT 可以报告 much less memory than the actual usage, or it can also report
在 Java 应用程序中监控 RSS 很简单。您已经了解 /proc/<pid>/status
,那么为什么不直接阅读 Java 代码中的 /proc/self/status
? (Linux 自动将 self
映射到当前进程 ID)。解析 /proc/self/stat
更容易,因为所有信息都以预定义格式在一行中提供。
也可以从 Java 应用程序中获取 NMT 报告,如 this answer 中所述。