利用Java剖析工具JProfiler查找內存泄漏的方法


本文主要介紹如何如何利用在使用JProfiler時意識到內存泄漏以及查找內存泄漏的幾種方法。

工具/原料

 
  • JProfiler

方法/步驟

 
  1. JProfiler的內存視圖會話提供了內存使用情況的動態更新視圖以及分配點的信息視圖。所有的視圖都有幾個聚集層並且能夠顯示現有存在的對象和作為垃圾回收的對象。本文主要介紹如何意識到內存泄漏以及查找內存泄漏的幾種方法。

  2. 意識到內存泄漏

    懷疑內存泄漏的第一步就是查看 "Memory"和"Recorded objects" 遙感勘測視圖。當應用程序出現內存泄漏時,視圖中會顯示出帶有震盪的線性積極趨勢。如果沒有這樣的線性趨勢,您的應用程序可能只是消耗了大量的內存,而不是內存泄漏。處理方法很簡單,找出占用大量內存的類或陣列,盡量減少類或陣列的數量。

     

  3. 使用差異縮小內存泄漏

    查找內存泄漏的起源的第一步就是查找對象視圖和所記錄的對象視圖的差異。簡單的內存泄漏可以利用差分功能來追查。

    觀察對象視圖和所記錄的對象視圖的差異,然后找出該差異是有哪些類引起的。然后,當切換到熱點視圖時,選擇問題類別,然后觀察問題實例所分配到的差異列。此時,知道實例創建的方法。

     

  4. 堆遍歷器和內存泄漏

    當獲取了一堆快照時,首先你必須創建一個帶有對象實例的對象集。如果你在動態內存視圖中已經收窄內存泄漏原因的范圍,你可以使用 "show selection in heap walker"來保存操作並啟動堆遍歷器。

     

  5. 利用對象視圖找出內存泄漏原因

    大多數的內存泄漏可以被追溯到對象集群。這將產生一些大的retained size的對象。最大的對象視圖列出了帶有最大retained size的對象。你可以利用該樹形向下鑽取從而發現錯誤引用。

     

    利用Java剖析工具JProfiler查找內存泄漏的方法
  6. 使用參考圖找到內存泄漏的原因

    找出內存泄漏的核心工具是堆遍歷器中的參考圖。依次打開傳入引用,你可能會立即發現一個錯誤引用。在復雜的系統中,這往往是不可能的。在這種情況下,你必須要找到一個或多個"garbage collector roots"。Garbage collector roots是JVM中的點,不受垃圾回收機制的約束。當你選擇了傳入引用或圖形中的一個對象時,頂部的[Show path to GC root] 按鈕被啟用。

     

    利用Java剖析工具JProfiler查找內存泄漏的方法
  7. garbage collector roots非常多,若全部顯示它們,可能會造成大量堆積,如圖所示。此外,查找garbage collector roots也很耗時。 如果找到成千上萬的roots,計算的時間很長而且會占用大量內存。為了防止這些問題,最好開始時從單個garbage collector root 開始查找,然后根據利用 UP to roots 根據需要慢慢增加garbage collector root。

    利用Java剖析工具JProfiler查找內存泄漏的方法
  8. garbage collector root 的鏈條可以很長,如圖所示:

    利用Java剖析工具JProfiler查找內存泄漏的方法
  9. 使用cumulated references views以查找內存泄漏的原因

    在某些情況下,您可能無法成功地縮小對象設置的規模。你的對象集中可能仍包含了大量的實例或者在此情況下,使用參考圖不可能會提供任何見解。這時,堆遍歷器的引用視圖中的 the cumulated reference tables 就可排上用場了。cumulated incoming reference table顯示了當前對象集中所有可能的引用類型:

    從引用類型中,你就可以縮小對象集。例如,您可能知道那些引用類型是正常的,那些是不正常的。

     

    利用Java剖析工具JProfiler查找內存泄漏的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM