一臼勉、內(nèi)存泄漏
描述
Android 的虛擬機(jī)是基于寄存器的 Dalvik啦膜,它的最大堆大小一般是 16M,有的機(jī)器為 24M柳沙。因此我們所能利用 的內(nèi)存空間是有限的。如果我們的內(nèi)存占用超過了一定的水平就會出現(xiàn) OutOfMemory 的錯誤拌倍。
常見的幾種內(nèi)存泄露
1.java堆內(nèi)存泄露
2.沒有充足的連續(xù)的內(nèi)存空間
3.線程數(shù)超出了限制
4.虛擬內(nèi)存不足
二赂鲤、內(nèi)存泄漏分析工具:
2.1 使用AndroidStudio 自帶的Profiler分析內(nèi)存是否有泄漏的情況
2.2 使用leakcanary檢測具體的內(nèi)存泄漏
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
}
三、線程泄漏分析工具
首先需要 jcenter:
repositories {
jcenter()
}
然后在您的 project gradle 的 dependencies 中添加:
classpath "com.codoon.threadtracker:threadtracker-plugin:1.1.0"
在您的 application gradle 中添加:
apply plugin: 'com.codoon.threadtracker'
debugImplementation 'com.codoon.threadtracker:threadtracker:1.1.0'
打包后會多生成一個 TreadTracker 圖標(biāo)柱恤,打開即可使用蛤袒。
* 如果您的項目尚不支持 androidx,可把以上 version 全部改成 1.0.0膨更;版本 1.1.0 及以后均需 androidx 支持妙真。
四、內(nèi)存溢出的幾點原因:
4.1 資源釋放問題
程序代碼的問題荚守,長期保持某些資源珍德,如 Context、Cursor矗漾、IO 流的引用锈候,資源得不到釋放造成內(nèi)存泄露。
4.2 對象內(nèi)存過大問題
保存了多個耗用內(nèi)存過大的對象(如 Bitmap敞贡、XML 文件)泵琳,造成內(nèi)存超出限制。
4.3 static 關(guān)鍵字的使用問題
針對 static 的解決方案
a誊役、應(yīng)該盡量避免 static 成員變量引用資源耗費過多的實例获列,比如 Context。
b蛔垢、Context 盡量使用 ApplicationContext击孩,因為 Application 的 Context 的生命周期比較長,引用它不會出現(xiàn)內(nèi)存泄露的問題鹏漆。
c巩梢、使用 WeakReference 代替強(qiáng)引用创泄。比如可以使用 WeakReference<Context> mContextRef;