簡體   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