簡體   English   中英

如何使用堆轉儲識別Java Memory Analyzer中對象的引用所有者

[英]How to identify holder of reference to object in Java Memory Analyzer using heap dump

由於我在應用程序中出現OutOfMemoryErrors問題,因此我想找出根本原因。 我從AIX服務器上的IBM VM創建了一個堆轉儲(PHD),並嘗試使用IBM Support Assistant 4.1及其內存分析器工具對其進行分析。

解析堆轉儲后,ISA詢問我是否要運行泄漏可疑報告。

使用泄漏方面的支持,我得到了一些類的信息,這些類消耗了大量的內存。

我現在要標識的是對象引用的持有者,但是例如,我只能看到ArrayList包含哪些對象,而不能看到誰持有對該ArrayList的引用。

我如何獲得該信息?

在Memory Analyzer(MAT)中加載堆轉儲。

在此處輸入圖片說明 轉到直方圖,然后查看大尺寸的對象。

在此處輸入圖片說明 現在,右鍵單擊此按鈕,然后選擇“即時控制者”。 它將打開一個統治者樹,您可以識別什么在握住您的對象。

在此處輸入圖片說明

有時,當大對象是局部變量時,您將無法在樹中看到直接的支配者。 它只能告訴您變量是哪個線程的一部分。(下圖沒有顯示此局部變量的情況)

在此處輸入圖片說明

在這種情況下,請檢查(堆棧跟蹤)在哪里獲取OutOfMemoryError。 然后相應地向后跟蹤它,並嘗試找出使用哪種方法將大對象創建為局部變量。 在大多數情況下,我們使用相同的方法來獲取大型對象,這在某個時間點顯示在堆棧跟蹤中,同時分配更多的內存時,我們會得到OutOfMemoryError。

更多細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM