使用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_histogram
and jstat -gc
,堆使用量约为 250MB,但使用VM.native_memory
堆使用量(在该Java Heap
部分中提交)约为 1000000KB(略小于 1GB),但实际 RSS 内存似乎更接近于VM.native_memory
我现在的猜测是VM.native_memory
Java Heap 包含尚未被垃圾收集的内存,但即使我运行垃圾收集,我看到jstat -gc
急剧减少的结果VM.native_memory
完全没有受到影响(尽管我听说用户手动调用垃圾收集不会总是导致完整的垃圾收集,但似乎至少这jstat -gc
似乎与GC.class_histogram
.
我听说的另一件事是,top
当使用内存的进程释放它时,并不总是释放剩余内存,直到绝对需要释放该内存。
所以总结一下
- 为什么显示与和
VM.native_memory
不同的堆内存使用情况?jstat
GC.class_histogram
- 我应该使用哪个指标来确定我的 java 进程正在使用多少内存?(考虑到剩余内存
top
可能并不总是反映实际使用情况)