什么是內存泄漏
在Java中,內存泄漏的對象有下面兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路與其相連;其次,這些對象是無用的,即程序以后不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定為Java中的內存泄漏,這些對象不會被GC所回收,然而它卻占用系統內存。
下面給出了一個簡單的內存泄露的例子。循環申請Object對象,并將所申請的對象放入Vector中,如果僅僅釋放引用本身,那么Vector仍然引用該對象,所以這個對象對GC來說是不可回收的。因此,如果對象加入到Vector后,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置為null。
Android中常見內存泄露
單例模式的內存泄漏
修改后的代碼
Handler引起的內存泄漏
解決方案
多線程引起的內存泄漏
修改后的代碼
集合類內存泄漏
解決方法
Webview的內存泄漏
WebView在加載網頁后會長期占用內存而不能被釋放,因此在Activity銷毀后要調用它的destory()方法來銷毀它以釋放內存
另一解決的方案就是給webview一個單獨的進程,當webview所在的activity銷毀時,直接殺掉這個單獨開啟的進程,此方案的注意點:1.app內進程間通信需要通過廣播和aidl交互,2.數據持久化需要通過ContentProvider進行處理
常用內存泄漏檢測工具
可以使用自帶的MAT性能分析工具,也可以使用LeakCanary。這個工具是在Github開源的,是Square公司出品的,其使用簡單方便。
其實無論是AndroidStudio中自帶的MAT內存分析工具,還是LeakCanary,原理都是一樣的,都是dump java heap出來進行分析,找到泄漏的問題,只是LeakCanary已經幫我們把分析的工作做好了