[英]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.