注意到生產服務器 (Websphere8.5.5) 開始消耗大量內存。javacore dump 中的數字清楚地表明罪魁禍首是一個過度生長的堆:| +--Memory Manager (GC): 5,496,900,272 bytes / 3193 allocations| | || | +--Java Heap: 5,368,770,560 bytes / 1 allocation| | || | +--Other: 128,129,712 bytes / 3192 allocations 但同時,在 MAT 中打開的 heap dump 報告堆的總體積約為 200M(有時高達 300M,但絕不會更多)。它的真正含義是什么?堆轉儲值得信賴嗎?如果是,有沒有辦法釋放未使用的堆內存?
1 回答

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
該NATIVEMEMINFO
部分顯示了虛擬內存,因此5,368,770,560
僅表示 JVM 已為堆虛擬分配了那么多內存。實際駐留多少將取決于實際堆大小和堆使用情況。例如,如果在tenured region中堆積了大量垃圾,然后在full GC中被清除,那么這些頁面可能在某個時候成為常駐頁面,但實際存活的數量取決于許多因素。我相信當 JVM 啟動時,它實際上分配了 的完整大小,-Xmx
所以我認為你總是會在 NATIVEMEMINFO 中看到堆的完整大小(也可能是它只分配了-Xms
,所以如果你看到的大于-Xms
,那么這意味著壓力驅動堆增加[當然,注意正常的鋸齒])。
當您在 MAT 中加載轉儲時,它會運行完整的垃圾回收并默認從主視圖中刪除所有無法訪問的對象。您可以單擊“概覽”頁面上的“無法訪問的對象直方圖”鏈接并滾動到底部的淺堆總數總和行,以查看堆轉儲中有多少“垃圾”。MAT 首選項中還有一個選項“保留無法訪問的對象”,它將所有這些對象保留在主 MAT 視圖中,但這通常不是很有用。
所以基本的答案是 MAT 只顯示活動對象,所以在你轉儲時,有 200-300MB 的活動對象。其余的可能在垃圾箱中,或者根本不存在,而 NATIVEMEMINFO 只是顯示虛擬大小。
隨著時間的推移查看堆使用情況的更好方法是在GCMV 中使用 verbosegc 和 load :
-Xverbosegclog:verbosegc.%seq.log,20,50000
添加回答
舉報
0/150
提交
取消