繁体   English   中英

Java 本机 memory 跟踪堆提交的数量远远超过堆转储的总数

[英]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_histogramjstat -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 并不总是被释放。

所以总结一下

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

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

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

这意味着 jvm 将向 os 请求 mem(从top检查),但是否真正使用它取决于它自己(通过jstatjmap检查)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM