1

使用jdk1.8.0_152我正在尝试追踪我的 java 程序的哪一部分使用的内存最多(主要在堆中)

使用top我看到整个过程使用了大约 1.109G 的剩余内存

使用jcmd {PID} VM.native_memory我看到总保留是 4704896 KB,提交是大约 1290820 KB。已提交的内存略多于剩余内存,但我读过并非所有已提交的内存都可以分页到实际内存,所以我不太担心这种差异

我现在主要关心的是我VM.native_memory使用时堆内存使用量和总堆使用量之间的差异jcmd {PID} GC.class_histogram

我还尝试比较使用的堆使用情况jstat -gc {PID},得到的结果类似于GC.class_histogram

根据GC.class_histogramand jstat -gc,堆使用量约为 250MB,但使用VM.native_memory堆使用量(在该Java Heap部分中提交)约为 1000000KB(略小于 1GB),但实际 RSS 内存似乎更接近于VM.native_memory

我现在的猜测是VM.native_memoryJava Heap 包含尚未被垃圾收集的内存,但即使我运行垃圾收集,我看到jstat -gc急剧减少的结果VM.native_memory完全没有受到影响(尽管我听说用户手动调用垃圾收集不会总是导致完整的垃圾收集,但似乎至少这jstat -gc似乎与GC.class_histogram.

我听说的另一件事是,top当使用内存的进程释放它时,并不总是释放剩余内存,直到绝对需要释放该内存。

所以总结一下

  1. 为什么显示与和VM.native_memory不同的堆内存使用情况?jstatGC.class_histogram
  2. 我应该使用哪个指标来确定我的 java 进程正在使用多少内存?(考虑到剩余内存top可能并不总是反映实际使用情况)
4

1 回答 1

0

我猜你的 jvm 堆已经设置了一个范围大小。

本机内存跟踪器从 os 视图(接近top命令)显示内存大小,而jstat从 jvm 以内部视角显示。

这意味着 jvm 将向 os 请求 mem(检查 from top),但真正使用它与否取决于它自己(检查jstator jmap)。

于 2020-08-14T11:40:29.813 回答