Android內存泄露排查


Android內存泄露排查

內存泄露是指有個引用指向一個不再被使用的對象,導致該對象不會被垃圾回收器回收。在JAVA中是通過可達性(Reachability Analysis)來判斷對象是否可以被回收。這個算法的基本思想是:通過一系列的稱謂”GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走的路徑稱為引用鏈,當不存在一條從GC Roots到該對象的引用鏈時,則該對象被判定為可以被回收的對象,反之不能被回收

4種Java引用淺解(http://blog.csdn.net/kimylrong/article/details/24634383)

Java引用和GC

按照一個對象的引用可達(Reachable)強度,由強到弱分為5類,如下:

1,強可達(Strong Reachable):在一個線程內,無需引用直接可達,新創建的對象是強可達的。
2,軟可達(Soft Reachable):不是強可達的,但是通過一個軟引用(SoftReference)可達。
3,弱可達(weak Reachable):既不是強可達也不是軟可達,但是通過一個弱引用(WeakReference)可達。
4,虛可達(Phantom Reachable):既不是強可達,不是軟可達,也不是弱可達,但是通過一個虛引用(PhantomReference)可達。
5,不可達(Unreachable):沒有任何引用指向對象。

當Java虛擬機(JVM)覺得內存不夠用的時候,會觸發垃圾回收操作(GC),清除無用的對象,釋放內存。

Java垃圾回收器會優先清理可達強度低的對象。另外有兩個重要的點:
強可達的一定不會被清理
JVM保證拋出out of memory之前,清理所有的軟引用對象

下面分別介紹4種引用類型:

1,強引用(StrongReference)
我們平時申明變量使用的就是強引用,普通系統99%以上都是強引用。比如,String s = “Hello World”

2,弱引用(WeakReference)
垃圾回收器某個時刻決定回收軟可達的對象的時候,會清理軟引用,並可選的把引用存放到一個引用隊列(ReferenceQueue)。

3,軟引用(SoftReference)
類似弱引用,只不過Java虛擬機會盡量讓軟引用的存活時間長一些,迫不得已才清理。

4,虛引用(PhantomReference)
僅用來處理資源的清理問題,比Object里面的finalize機制更靈活。get方法返回的永遠是null,Java虛擬機不負責清理虛引用,但是它會把虛引用放到引用隊列里面。

內存排查時,只檢查強引用,其他在gc的時候會被回收掉。

Android內存泄露排查

1,安裝debug包進行操作,然后退出需要檢查內存的頁面,或者退出app

2, 打開exlipse 或者 Android Studio, 選擇DDMS插件
這里寫圖片描述

3,在DDMS插件界面左側能看到應用主進程,如com.tmall.wireless
這里寫圖片描述

4,選擇UpdateHeap,然后點擊右側的GC,然后點擊dump Hprof File
這里寫圖片描述

5,將生成的hprof使用hprof-conv工具進行轉換
hprof-conv oldPathAndName.hprof newPathAndName.hprof

6,使用Mat工具打開文件
這里寫圖片描述

7,在classname中輸入activity,查找對應activity dump出來的內存。
這里寫圖片描述

8,在可疑對象上右鍵,選擇 “show objects by class” -> “by incoming references”,查看所有的引用這個實例的對象
這里寫圖片描述

9,過濾掉非強引用,打開后的tab顯示了所有引用這個Object的對象,繼續右鍵過濾掉所有無效的引用:”exclude all phantom/weak/sof etc. references”
這里寫圖片描述

10,最后剩下的那個就是引起泄漏的問題
這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: