[英]Java native memory tracking heap committed much more than total from heap dump
使用jdk1.8.0_152
我试图追踪我的 java 程序的哪一部分使用最多的 memory (主要在堆中)
使用top
我看到整个过程使用了大约 1.109G 的剩余 memory
使用jcmd {PID} VM.native_memory
我看到保留的总大小为 4704896 KB,提交的大小约为 1290820 KB。 已提交的比剩余的 memory 略多,但我读过并非所有已提交的 memory 都可以被分页到实际的 memory 所以我不太担心这种差异
我现在主要关心的是使用jcmd {PID} GC.class_histogram
时 VM.native_memory 的堆VM.native_memory
使用量和总堆使用量之间的区别
我还尝试使用jstat -gc {PID}
比较堆使用情况并得到类似于GC.class_histogram
的结果
根据GC.class_histogram
和jstat -gc
,堆使用量约为 250MB,但使用VM.native_memory
堆使用量(在Java Heap
部分提交)约为 1000000KB(略小于 1GB)但实际 RSS ZCD69B4957F06CD8191ZBFED3 VM.native_memory
中提交的总数
我现在的猜测是VM.native_memory
Java 堆包含尚未被垃圾收集的 memory 但即使我运行垃圾收集,我看到jstat -gc
的结果急剧下降而VM.native_memory
根本没有受到影响(尽管我'听说用户手动调用垃圾收集并不总是会导致完整的垃圾收集,但至少jstat -gc
似乎与GC.class_histogram
的结果相匹配。
我听说的另一件事是,当使用 memory 的进程释放它直到 memory 绝对需要被释放时, top
的残留 memory 并不总是被释放。
所以总结一下
VM.native_memory
显示与jstat
和GC.class_histogram
不同的堆 memory 使用情况?top
的剩余 memory 可能并不总是反映实际使用情况)我猜你的 jvm 堆已经设置了一个范围大小。
原生 memory 跟踪器从 os 视图(接近top
命令)显示 memory 大小,而jstat
从 jvm 以内部视角显示。
这意味着 jvm 将向 os 请求 mem(从top
检查),但是否真正使用它取决于它自己(通过jstat
或jmap
检查)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.