1. 什么是內(nèi)存泄漏聪舒, 內(nèi)存泄漏會(huì)導(dǎo)致什么問題?
指一個(gè)對(duì)象不再使用辱志,本應(yīng)該被回收蝠筑,但由于某些原因?qū)е聦?duì)象無法回收,仍然占用著內(nèi)存揩懒,這就是內(nèi)存泄漏什乙。
Java有一套自己的內(nèi)存回收機(jī)制,但往往被一些不好的開發(fā)習(xí)慣導(dǎo)致對(duì)象無法回收已球,進(jìn)而會(huì)使應(yīng)用程序使用時(shí)間越長臣镣,內(nèi)存占用率越高,超出系統(tǒng)給設(shè)置的閾值的時(shí)候就會(huì)造成OOM(Out Of Memory)內(nèi)存溢出的問題智亮。當(dāng)應(yīng)用切換到后臺(tái)的時(shí)候忆某,系統(tǒng)會(huì)優(yōu)先回收內(nèi)存占用率高的應(yīng)用,造成應(yīng)用的不穩(wěn)定性(比如后臺(tái)執(zhí)行操作的時(shí)候直接被銷毀了)
2. 內(nèi)存泄漏產(chǎn)生的原因和解決方案
創(chuàng)建單例的時(shí)候引用Activity的Context阔蛉,單例的周期和應(yīng)用的周期一致弃舒,當(dāng)Activity被銷毀的時(shí)候,內(nèi)存不會(huì)被回收状原。引用Application的Context即可解決
使用Thread+Hander或者AsyncTask進(jìn)行耗時(shí)操作的時(shí)候聋呢,Activity被銷毀的時(shí)候苗踪,耗時(shí)操作未完成,內(nèi)存不會(huì)被回收削锰,耗時(shí)操作完成時(shí)也會(huì)引起崩潰徒探。在Activity銷毀的時(shí)候,移除耗時(shí)操作
使用WebView的時(shí)候造成的內(nèi)存泄漏喂窟,不同版本存在不同的問題测暗。在Activity被銷毀的時(shí)候,通過WebView的父布局移除WebView磨澡,或者開啟新進(jìn)程碗啄,在結(jié)束操作的時(shí)候直接System.exit(0)結(jié)束掉進(jìn)程,但需要注意進(jìn)程間的通訊
IO操作時(shí)稳摄,未關(guān)閉流稚字,數(shù)據(jù)庫操作時(shí),未關(guān)閉游標(biāo)
3. 如何檢測(cè)內(nèi)存泄漏
Square的開源庫LeakCanary厦酬,內(nèi)存泄漏時(shí)胆描,會(huì)進(jìn)行通知欄提醒