Android性能優(yōu)化--內(nèi)存優(yōu)化(1)

Performance Optimization
接下來一段時(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ù)努力做到更好。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,157評論 25 708
  • 被文同時(shí)發(fā)布在CSDN上,歡迎查看。 APP內(nèi)存的使用,是評價(jià)一款應(yīng)用性能高低的一個(gè)重要指標(biāo)。雖然現(xiàn)在智能手機(jī)的內(nèi)...
    大圣代閱讀 4,971評論 2 54
  • HereAndroid的內(nèi)存優(yōu)化是性能優(yōu)化中很重要的一部分,而避免OOM又是內(nèi)存優(yōu)化中比較核心的一點(diǎn)。這是一篇關(guān)于...
    HarryXR閱讀 3,934評論 1 24
  • 在商言商,無利不往。當(dāng)商家“顧客是上帝”的忽悠聲一浪高過一浪時(shí),咱們消費(fèi)者誰購物沒有上過當(dāng)?大到汽車的質(zhì)量隱患,小...
    碧海青天2017閱讀 236評論 0 1
  • 1.別太自滿,你不了解的還有很多。 2.英雄要是跑了,那么誰來戰(zhàn)斗呢? 3.早上起床1小時(shí)內(nèi)不玩電腦、手機(jī)。
    Eric小風(fēng)閱讀 199評論 0 0

友情鏈接更多精彩內(nèi)容