Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 內存洩漏分析技巧

android 內存洩漏分析技巧

編輯:關於Android編程

java虛擬機運行一般都有一個內存界限,超過這個界限,就會報outofmemory。這個時候一般都是存在內存洩漏。解決內存洩漏問題,竊以為分為兩個步驟:分析應用程序是否真的有內存洩漏,找到內存洩漏的地方。這兩個步驟都不是一般意義上的調試,直接打log,斷點調試都不是太給力。動腦筋想一想,內存問題應該在很多地方上都會出現,這麼常見的問題應該是有工具的。android現在更可以說是一個生態系統,當然也有很多開發輔助工具。在前面的兩個步驟中都有很強大的武器,熟練的掌握這些利器,分析問題就會事半功倍。

分析是否有內存洩漏一:adb shell dumpsys meminfo package_name(adb shell dumpsys meminfo pid)

\

如上圖所示,可以直接看出當前應用的內存占用情況。大多數情況下,我們都是關心第一二兩行的一二兩列。如果我們懷疑某個界面有內存洩漏的情況,就可以通過以下方法來判斷。重復的執行這個步驟多次,然後看一下執行前後內存占用情況。如果內存有明顯的增長,並且一段時間內沒有恢復,基本就可以確認代碼中有內存洩漏的地方。
分析是否有內存洩漏二:DDMS實時查看,注意要在DDMS上顯示系統所有進程,這個需要手機有root權限。
選中要分析的進程,進入heap界面,點擊Cause GC按鈕,之後這個界面會定時刷新。一般只要關注data Object這一行,這個也就是我們的對象占用的內存。java的內存洩漏就是對象使用完沒有及時釋放導致不能被GC。關注data Object一般直接關注total Size,根據這個值的大小增長來判斷當前是否有內存洩漏。同樣在一段時間內重復操作某個動作,觀察data Object的total Size有木有明顯的增長。
上面的兩個方法都是分析應用有木有內存洩漏的問題,主要思想都是重復某一個操作,看看內存有沒有明顯增長,並且沒有恢復。正常的應用都會穩定在一個小的范圍內,有問題的應用一般都是持續增長,很難恢復。兩個工具中,一個是手動刷新,一個是自動刷新,相比較而言,筆者推薦第一個方法。人工控制,感覺更好。
發現應用存在內存洩漏是不夠的,我們最終目的是解決問題。這個時候就需要找到內存洩漏的地方。Eclipse已經為我們提供了強大的內存分析工具MAT,下載地址是:http://www.eclipse.org/mat/。使用這個工具之前,先要生成一個記錄進程內存分部情況的HPROF文件,然後使用MAT來分析內存的占用情況。DDMS上有個DUMP HPROF FILE的按鈕,這個就可以直接生成HPROF文件。
如果eclipse上已經安裝了MAT插件,生成的同時也就打開了這個文件。不過個人喜歡將MAT單獨使用,感覺更快捷更方便。MAT打開了HPROF文件之後,就能顯示當前內存占用圖。

\

從這個圖中的圓形圖片就能看出當前哪些地方占用的內存最多。一般內存洩漏都是在這幾個地方。圖中有個leak suspects的鏈接,點擊就能查看詳情了,能看到哪些對象占用了內存。如果某個類有太多的對象,基本上就這個類產生的內存洩漏,找到分配對象的地方,很快就能找到哪裡邏輯不健壯,使用完之後沒有及時釋放內存。

分析內存洩漏,找到修改地方都是一劑良藥,能一開始就就注意避免後續的分析才是最好的。

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