【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )
文章目錄
- 一、 內(nèi)存中最大的對(duì)象
- 二、 查看每個(gè)類的對(duì)象實(shí)例的個(gè)數(shù)
- 三、 查看對(duì)象的引用與被引用
- 四、 查看對(duì)象到 GC Roots 的最短距離
- 1、 選擇 Merge Shortest Paths to GC Roots
- 2、 GC Roots 與 GC 垃圾回收
- 3、 Merge Shortest Paths to GC Roots 各個(gè)選項(xiàng)簡(jiǎn)介
- 4、 查看對(duì)象強(qiáng)引用引用鏈
內(nèi)存泄漏原理 : 長(zhǎng)生命周期對(duì)象 , 持有短生命周期對(duì)象的引用 , 并且是強(qiáng)引用持有 , GC 無法釋放該短生命周期對(duì)象引用 , 造成 OOM ;
Android Profiler 工具參考官方文檔 : 使用 Memory Profiler 查看 Java 堆和內(nèi)存分配
使用 Memory Analyzer ( MAT ) 內(nèi)存分析工具分析內(nèi)存快照 , 首先要將內(nèi)存快照文件 , 轉(zhuǎn)化成 MAT 工具能識(shí)別的文件 , 然后使用 MAT 工具進(jìn)行分析 ;
在博客 【Android 內(nèi)存優(yōu)化】Android Profiler 工具常用功能 ( 監(jiān)測(cè)內(nèi)存 | 內(nèi)存快照 ) 中保存了內(nèi)存快照文件 memory-20200625T145636.hprof , 要使用 MAT 工具分析該內(nèi)存快照 , 需要先將該文件轉(zhuǎn)換成為 MAT 標(biāo)準(zhǔn)的文件格式 ;
在博客 【Android 內(nèi)存優(yōu)化】使用 Memory Analyzer ( MAT ) 工具分析內(nèi)存 ( hprof 文件轉(zhuǎn)換 | MAT 工具下載 | MAT 工具使用 ) 中轉(zhuǎn)換了 MAT 格式的內(nèi)存快照 , 下載 Memory Analyzer ( MAT ) 內(nèi)存分析工具 , 并在該工具中加載了 MAT 格式的文件 ;
本博客中開始在 Memory Analyzer ( MAT ) 內(nèi)存分析工具 中分析內(nèi)存快照 ;
一、 內(nèi)存中最大的對(duì)象
內(nèi)存中最大的對(duì)象 : Overview 中的餅圖中 , 列出了占用最大內(nèi)存的對(duì)象 ;
二、 查看每個(gè)類的對(duì)象實(shí)例的個(gè)數(shù)
1. 查看每個(gè)類的對(duì)象實(shí)例的個(gè)數(shù) : 點(diǎn)擊 Histogram 直方圖 , 查看每個(gè)類實(shí)例個(gè)數(shù) ;
2. Histogram 直方圖界面如下 : 其中列出了每個(gè)類對(duì)象個(gè)數(shù) ;
三、 查看對(duì)象的引用與被引用
對(duì)象的引用與被引用 : 右鍵點(diǎn)擊某對(duì)象 , 選擇 List objects 選項(xiàng) ;
① 查看該對(duì)象引用了哪些對(duì)象 : 選擇 with incoming reference 選項(xiàng) ;
② 查看該對(duì)象被哪些對(duì)象引用 : 選擇 with outgoing reference 選項(xiàng) ;
四、 查看對(duì)象到 GC Roots 的最短距離
1、 選擇 Merge Shortest Paths to GC Roots
查看對(duì)象到 GC Roots 的最短距離 : 在右鍵菜單中選擇 " Merge Shortest Paths to GC Roots " , 這里就可以看到為什么對(duì)象可達(dá)性分析時(shí) , 某些對(duì)象應(yīng)該釋放 , 卻仍然存在與 GC Root 對(duì)象之間的引用鏈 ;
2、 GC Roots 與 GC 垃圾回收
存在與 GC Roots 引用鏈導(dǎo)致內(nèi)存泄漏 : 該對(duì)象可能與 GC Root 對(duì)象不是直接引用 , 而是由其它對(duì)象簡(jiǎn)介引用 , 導(dǎo)致存在這么一條引用鏈 ;
具體的 GC 回收原理在 【Android 內(nèi)存優(yōu)化】Java 內(nèi)存模型 ( Java 虛擬機(jī)內(nèi)存模型 | 線程私有區(qū) | 共享數(shù)據(jù)區(qū) | 內(nèi)存回收算法 | 引用計(jì)數(shù) | 可達(dá)性分析 ) 博客中的可發(fā)行分析章節(jié) , 有詳細(xì)的介紹 , 如果 GC Root 對(duì)象與某個(gè)對(duì)象之間有引用鏈 , 那么該對(duì)象無法被 GC 回收 ;
3、 Merge Shortest Paths to GC Roots 各個(gè)選項(xiàng)簡(jiǎn)介
Merge Shortest Paths to GC Roots 各個(gè)選項(xiàng)簡(jiǎn)介 :
- with all reference : 列出所有的引用 ;
- exclude weak reference : 排除弱引用 ;
- exclude soft reference : 排除軟引用 ;
- exclude phantom reference : 排除虛引用 ;
- exclude weak/soft reference : 排除弱引用和軟引用 ;
- exclude all phantom/weak/soft etc. reference : 排除虛引用 , 弱引用 , 軟引用 ; 只查看強(qiáng)引用 ;
4、 查看對(duì)象強(qiáng)引用引用鏈
③ 查看強(qiáng)引用引用鏈 : 這里選擇 exclude all phantom/weak/soft etc. reference 選項(xiàng) , 只查看到 GC Roots 的強(qiáng)引用引用鏈 ;
該 AppCompatTextView 類有三個(gè)對(duì)象的引用鏈 :
- MainActivity 引用了 SurfaceView 對(duì)象
- SurfaceView 對(duì)象 中的引用了 ConstraintLayout 對(duì)象
- ConstraintLayout 對(duì)象 引用了 View 對(duì)象
- View 對(duì)象 引用了兩個(gè) AppCompatTextView 對(duì)象
- ConstraintLayout 對(duì)象 引用了 View 對(duì)象
- SurfaceView 對(duì)象 中的引用了 ConstraintLayout 對(duì)象
- MainActivity 引用了 AppCompatDelegateImpl 對(duì)象
- AppCompatDelegateImpl 對(duì)象引用了 ActionBarOverlayLayout 對(duì)象
- ActionBarOverlayLayout 對(duì)象引用了 ActionBarContainer 對(duì)象
- ActionBarContainer 對(duì)象引用了 Toolbar 對(duì)象
- Toolbar 對(duì)象引用了 111 個(gè) AppCompatTextView 對(duì)象
- ActionBarContainer 對(duì)象引用了 Toolbar 對(duì)象
- ActionBarOverlayLayout 對(duì)象引用了 ActionBarContainer 對(duì)象
- AppCompatDelegateImpl 對(duì)象引用了 ActionBarOverlayLayout 對(duì)象
這樣就找到了是哪個(gè)類引用了我們要查找的目標(biāo)對(duì)象 , 然后在對(duì)應(yīng)代碼中查找為什么沒有釋放這個(gè)類 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 内存优化】Androi
- 下一篇: 【Android 内存优化】垃圾回收算法