日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )

發布時間:2025/6/17 Android 30 豆豆

文章目錄

  • 一、 內存中最大的對象
  • 二、 查看每個類的對象實例的個數
  • 三、 查看對象的引用與被引用
  • 四、 查看對象到 GC Roots 的最短距離
    • 1、 選擇 Merge Shortest Paths to GC Roots
    • 2、 GC Roots 與 GC 垃圾回收
    • 3、 Merge Shortest Paths to GC Roots 各個選項簡介
    • 4、 查看對象強引用引用鏈



內存泄漏原理 : 長生命周期對象 , 持有短生命周期對象的引用 , 并且是強引用持有 , GC 無法釋放該短生命周期對象引用 , 造成 OOM ;

Android Profiler 工具參考官方文檔 : 使用 Memory Profiler 查看 Java 堆和內存分配


使用 Memory Analyzer ( MAT ) 內存分析工具分析內存快照 , 首先要將內存快照文件 , 轉化成 MAT 工具能識別的文件 , 然后使用 MAT 工具進行分析 ;


在博客 【Android 內存優化】Android Profiler 工具常用功能 ( 監測內存 | 內存快照 ) 中保存了內存快照文件 memory-20200625T145636.hprof , 要使用 MAT 工具分析該內存快照 , 需要先將該文件轉換成為 MAT 標準的文件格式 ;


在博客 【Android 內存優化】使用 Memory Analyzer ( MAT ) 工具分析內存 ( hprof 文件轉換 | MAT 工具下載 | MAT 工具使用 ) 中轉換了 MAT 格式的內存快照 , 下載 Memory Analyzer ( MAT ) 內存分析工具 , 并在該工具中加載了 MAT 格式的文件 ;


本博客中開始在 Memory Analyzer ( MAT ) 內存分析工具 中分析內存快照 ;





一、 內存中最大的對象



內存中最大的對象 : Overview 中的餅圖中 , 列出了占用最大內存的對象 ;





二、 查看每個類的對象實例的個數



1. 查看每個類的對象實例的個數 : 點擊 Histogram 直方圖 , 查看每個類實例個數 ;



2. Histogram 直方圖界面如下 : 其中列出了每個類對象個數 ;





三、 查看對象的引用與被引用



對象的引用與被引用 : 右鍵點擊某對象 , 選擇 List objects 選項 ;


① 查看該對象引用了哪些對象 : 選擇 with incoming reference 選項 ;

② 查看該對象被哪些對象引用 : 選擇 with outgoing reference 選項 ;





四、 查看對象到 GC Roots 的最短距離





1、 選擇 Merge Shortest Paths to GC Roots


查看對象到 GC Roots 的最短距離 : 在右鍵菜單中選擇 " Merge Shortest Paths to GC Roots " , 這里就可以看到為什么對象可達性分析時 , 某些對象應該釋放 , 卻仍然存在與 GC Root 對象之間的引用鏈 ;



2、 GC Roots 與 GC 垃圾回收


存在與 GC Roots 引用鏈導致內存泄漏 : 該對象可能與 GC Root 對象不是直接引用 , 而是由其它對象簡介引用 , 導致存在這么一條引用鏈 ;


具體的 GC 回收原理在 【Android 內存優化】Java 內存模型 ( Java 虛擬機內存模型 | 線程私有區 | 共享數據區 | 內存回收算法 | 引用計數 | 可達性分析 ) 博客中的可發行分析章節 , 有詳細的介紹 , 如果 GC Root 對象與某個對象之間有引用鏈 , 那么該對象無法被 GC 回收 ;



3、 Merge Shortest Paths to GC Roots 各個選項簡介


Merge Shortest Paths to GC Roots 各個選項簡介 :

  • with all reference : 列出所有的引用 ;
  • exclude weak reference : 排除弱引用 ;
  • exclude soft reference : 排除軟引用 ;
  • exclude phantom reference : 排除虛引用 ;
  • exclude weak/soft reference : 排除弱引用和軟引用 ;
  • exclude all phantom/weak/soft etc. reference : 排除虛引用 , 弱引用 , 軟引用 ; 只查看強引用 ;


4、 查看對象強引用引用鏈


③ 查看強引用引用鏈 : 這里選擇 exclude all phantom/weak/soft etc. reference 選項 , 只查看到 GC Roots 的強引用引用鏈 ;

該 AppCompatTextView 類有三個對象的引用鏈 :

  • MainActivity 引用了 SurfaceView 對象
    • SurfaceView 對象 中的引用了 ConstraintLayout 對象
      • ConstraintLayout 對象 引用了 View 對象
        • View 對象 引用了兩個 AppCompatTextView 對象

  • MainActivity 引用了 AppCompatDelegateImpl 對象
    • AppCompatDelegateImpl 對象引用了 ActionBarOverlayLayout 對象
      • ActionBarOverlayLayout 對象引用了 ActionBarContainer 對象
        • ActionBarContainer 對象引用了 Toolbar 對象
          • Toolbar 對象引用了 111 個 AppCompatTextView 對象

這樣就找到了是哪個類引用了我們要查找的目標對象 , 然后在對應代碼中查找為什么沒有釋放這個類 ;

總結

以上是生活随笔為你收集整理的【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。