Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 安卓開發中內存問題分析(一)工具篇

安卓開發中內存問題分析(一)工具篇

編輯:關於android開發

安卓開發中內存問題分析(一)工具篇


內存洩漏和內存溢出是安卓開發中經常碰到的問題,如何能夠快速有效的發現並追蹤內存洩漏或者內存溢出的源頭,是每個開發者都需要掌握的技巧,今天我給大家帶來常見的內存分析工具使用方法,希望對大家今後的開發帶來幫助。

使用Eclipse分析應用內存使用情況

具體步驟如下:
1.啟動eclipse後,切換到DDMS透視圖,並通過Window-ShowView打開Devices視圖、Heap視圖

2.連接手機或者模擬器後,在DDMS的Devices視圖中將會顯示手機設備或模擬器的序列號,以及設備中正在運行的部分進程信息

3.點擊選中想要監測的進程,然後再點擊下Update Heap讓其自動找到我們運行中應用的進程

這裡寫圖片描述
這裡寫圖片描述

4.點擊Heap視圖中的“Cause GC”按鈕,請求一次GC操作(PS:當內存使用信息第一次顯示以後,無須再不斷的點擊“Cause GC”,Heap視圖界面會定時刷新,在對應用的不斷的操作過程中就可以看到內存使用的變化)

這裡寫圖片描述

5.點擊Cause GC之後就可以看到我們應用的內存情況如下圖:

這裡寫圖片描述
6.具體使用過程中,我們要關注 Heap視圖中部有一個Type叫做data object,即數據對象,也就是我們的程序中大量存在的類的對象。在data object一行中有一列是“Total Size”,其值就是當前進程中所有Java數據對象的內存總量,如果大家想要看“Total Size”是分配的具體信息可以點擊“data object這一行來查看詳細信息,如下圖:

這裡寫圖片描述

在使用中 “Total Size”這個值的大小決定了是否會有內存洩漏。我們可以通過不斷的操作當前應用,同時觀察data object的Total Size值的變化情況;正常情況下Total Size值都會穩定在一個有限的范圍內,也就是說由於程序中的的代碼良好,沒有造成對象不被垃圾回收的情況,所以說雖然我們不斷的操作會不斷的生成很多對象,而在虛擬機不斷的進行GC的過程中,這些對象都被回收了,內存占用量會會落到一個穩定的水平;反之如果代碼中存在沒有釋放對象引用的情況,則data object的Total Size值在每次GC後不會有明顯的回落,隨著操作次數的增多Total Size的值會越來越大,正常情況下,一個虛擬機的進程的內存在64M, 如果內存洩漏會發現 Heap Size 在不斷的逼近 64M, 一旦達到這個值時,就會出現內存洩漏退出應用等情況。
Total Size的值越來越大時,我們按下“Dump HPROF File”按鈕,這個時候會提示設置hprof文件的保存路徑。保存後,我們可以使用MAT工具來分析是哪些操作造成了內存洩漏。

使用MAT分析hprof文件

Eclipse Memory Analyzer(MAT)是著名的跨平台集成開發環境 Eclipse Galileo 版本的 33 個組成項目中之一,它是一個功能豐富的JAVA 堆轉儲文件分析工具,可以幫助你發現內存漏洞和減少內存消耗。對於大型 JAVA 應用程序來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環境下暴露出來,並且很難在測試環境中進行重現。JVM 能夠記錄下問題發生時系統的部分運行狀態,並將其存儲在堆轉儲 (Heap Dump) 文件中,從而為我們分析和診斷問題提供了重要的依據。
從官網中下載最新的MAT工具,打開後如下圖:

這裡寫圖片描述

廢話不多說,MAT的使用步驟如下:
1.打開 MAT 工具,File–>Open Heap Dump… 選擇你剛剛保存的 hprof 文件打開
此時,會彈出一個錯誤,如下圖所示:

這裡寫圖片描述

不要以為是 MAT 工具版本不對,其實是 android 的 hprof 文件在這裡需要進行轉換一下格式才可以使用 MAT 打開,使用AndrodiSDK/tools/hprof-conv轉化hprof文件,
首先,要通過控制台進入到你的 android sdk tools 目錄下
例如 hprof-conv input.hprof out.hprof
再使用MAT工具打開轉換後的 hprof 文件,就能看到完整的內存使用分析報告了

這裡寫圖片描述

2.如下所示是 MAT 分析內存使用的主界面:

這裡寫圖片描述

點擊上圖中的 Reports –>Leak Suspects 則可以進一步看到更詳細的內存洩漏疑點

這裡寫圖片描述

在其中懷疑的地方,點擊 Details 就可以看到具體的內存使用情況了。

這裡寫圖片描述

從上圖中我們可以看到內存聚集點是一個擁有大量對象的集合,這個對象集合中保存了大量 Person 對象的引用,就是它導致的內存洩露。
3.另外我們經常會使用Histogram查詢

這裡寫圖片描述

在某一項上右鍵打開菜單選擇 list objects ->with incoming references 將列出該類的實例,也可以點擊表頭進行排序,在表的第一行可以輸入正則表達式來匹配結果

這裡寫圖片描述

4.在選中某一項上右鍵打開菜單選擇 list objects ->with incoming refs 將列出該類的實例:

這裡寫圖片描述

在新打開的Tab頁面中展示了對象間的引用關系。

這裡寫圖片描述

如果想查看某個實例沒被釋放的原因,可以右健 Path to GC Roots–>exclue all phantom/weak/soft etc. reference :這樣變可以快速查看某個對象的 GC Root

這裡寫圖片描述

5.有時候為查找內存洩漏,我們通常需要兩個Dump結果作對比,這時我們可以打開 Navigator History面板,將兩個表的 Histogram結果都添加到 Compare Basket中去 :

這裡寫圖片描述

這裡寫圖片描述

然後點擊面板右上角的紅色歎號,得到對比結果:

這裡寫圖片描述

這裡寫圖片描述

同時也可以改變對比條件:

這裡寫圖片描述

使用AndroidStudio分析應用內存使用情況

現在開發者普遍使用AndroidStudio進行開發,關於內存使用的分析更加人性化,其內部也默認支持hprof文件的分析,下面帶領大家一起學習一下:
(一) 使用AndroidStudio追蹤內存使用狀況,打開Android Monitor面板(PS:快捷鍵Alt+6),點擊Memory選項卡

這裡寫圖片描述

(二) 使用AndroidStudio分析hprof文件,具體步驟如下:
1. 在AndroidStudio菜單欄中開Android Device Monitor,如下圖:

這裡寫圖片描述

2.在Android Device Monitor界面中選在你要分析的應用程序的包名,同時點擊Update Heap用來更新統計信息,然後點擊Cause GC即可查看當前堆的使用情況,如下圖

這裡寫圖片描述

3.點擊Dump HPROF file,將該應用當前的內存信息保存成hprof文件,存放到你所指定的路徑,如下圖

這裡寫圖片描述

4.在File菜單欄中打開剛才保存的hprof文件(當然為了省事,你也可以直接將hprof文件拖入AndroidStudio中)

這裡寫圖片描述

5.在打開的hprof文件中,我們可以很容的找到自己應用程序的包名,打開對應包就可以看到內存使用情況。

這裡寫圖片描述

使用LeakCanary分析應用內存使用情況

這裡寫圖片描述

LeakCanary 是一個開源的在debug版本中檢測內存洩漏的java庫。
GitHub地址:https://github.com/square/leakcanary
(一)配置說明:

這裡寫圖片描述

(二)使用案例:

這裡寫圖片描述

創建一個RefWatcher實例,然後給它一個對象讓它觀察:
refWatcher.watch(schrodingerCat);
當檢測出洩漏的時候,你會自動得到一個漂亮的洩漏線索:

GC ROOT static Docker.container references Box.hiddenCat leaks Cat instance

然後只需幾行代碼,LeakCanary就能自動檢測Activity的洩漏:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160414/042455IO-30.png" title="\" />

最終當出現內存不足時,你將看到如下通知界面:

這裡寫圖片描述

也就是說,啟用LeakCanary之後,可以幫助我們更加方便的發現和修復許多內存問題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved