
接下來一段時(shí)間會(huì)持續(xù)更新“性能優(yōu)化”專題中有關(guān)于Android方面的文章,敬請關(guān)注!
Android性能優(yōu)化--內(nèi)存優(yōu)化(2)
1.什么是內(nèi)存泄露?
當(dāng)出現(xiàn)對Activity、View或drawable等類的對象長期持有無用的引用,就會(huì)造成被引用的對象無法在GC(垃圾回收器)時(shí)回收,而是長期占用堆空間,此時(shí)就會(huì)發(fā)生內(nèi)存泄漏。
2.常見的幾種導(dǎo)致內(nèi)存泄露的原因
(1).static關(guān)鍵字的使用,例如使用這樣的代碼:private static Activity context;當(dāng)我們使用static來修改成員變量時(shí),該變量就屬于該類,而不是這個(gè)類的實(shí)例。
(2).線程的使用,由于線程生命周期的不可控,很容易造成內(nèi)存泄露,另外,當(dāng)和handler一起使用來實(shí)現(xiàn)線程間的通信時(shí),在sendMessage完成之后如果不及時(shí)的將msg和handler置為null,也將造成內(nèi)粗泄露。
(3).Bitmap對象不再使用時(shí)沒有及時(shí)調(diào)用recycle()釋放內(nèi)存。
(4).Context泄露
private static Drawable sBackground;
@Override
protectedvoid onCreate(Bundle state) {
super.onCreate(state);
TextView label =new TextView(this);
label.setText("Leaks are bad");
if (sBackground ==null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
/-----------------------------------------------------/
在第一次屏幕方向切換時(shí)它泄露了一開始創(chuàng)建的Activity。
當(dāng)一個(gè)Drawable附加到一個(gè) View上時(shí),View會(huì)將其作為一個(gè)callback設(shè)定到Drawable上。
上述的代碼片段,意味著Drawable擁有一個(gè)TextView的引用,
而TextView又擁有Activity(Context類型)的引用,換句話說,Drawable擁有了更多的對象引用。
即使Activity被銷毀,內(nèi)存仍然不會(huì)被釋放。
。。。(有關(guān)內(nèi)存泄露的原因此處不再過多的列舉,相關(guān)的文字網(wǎng)上有很多)
3.問題分析
今天我們借助Android Studio來分析問題
(1)利用AS自帶的代碼檢查工具進(jìn)行初步檢查

代碼檢查工具的入口

選擇需要分析的文件或工程

分析結(jié)果
(2).利用AS自帶的內(nèi)存分析工具查看內(nèi)存使用以及是否存在泄露

通過點(diǎn)擊AS左下方的Android Monitor可以查看內(nèi)存、CPU等使用情況。點(diǎn)擊Dump Java Heap按鈕就可查看到上圖的分析結(jié)果。通過對上圖的分析結(jié)果的查看,可以看到哪些地方可能存在內(nèi)存泄露。
(具體的分析結(jié)果可以自己嘗試使用AS的分析工具查看)
4.問題的解決
對于遇見比較多的類似于Static關(guān)鍵字、Context引用和Bitmap等內(nèi)存泄露問題,網(wǎng)上已經(jīng)有很多的解決方案,本文暫時(shí)不重復(fù)造輪子,后續(xù)的文章中會(huì)逐步的完善更新解決方案,達(dá)到優(yōu)化的效果。
總結(jié)
本專題中關(guān)于"Android性能優(yōu)化"的文章會(huì)逐步更新,如果有不足之處還望指教與諒解,謝謝!
也歡迎各位大牛分享自己關(guān)于性能優(yōu)化方面的經(jīng)驗(yàn),供后來者學(xué)習(xí)。
(網(wǎng)上關(guān)于該類文章可能已經(jīng)隨處可見,但是如果能夠按照自己的理解堅(jiān)持完成一個(gè)章節(jié)的總結(jié),還是很有幫助的,所以文章有很多不足之處,還望諒解,我會(huì)繼續(xù)努力做到更好。)