什么是內(nèi)存泄漏
1.內(nèi)存泄漏的原因
2.為什么有內(nèi)存泄漏
3.內(nèi)存泄漏都有哪些
1.內(nèi)存泄漏的原因
android 系統(tǒng)為每個(gè)應(yīng)用分配的內(nèi)存是有限的州丹,當(dāng)一個(gè)對(duì)象已經(jīng)不需要再使用了使鹅,
本該被回收時(shí)露戒,而有另外一個(gè)正在使用的對(duì)象持有它的引用從而導(dǎo)致它不能被回收贺嫂,
這導(dǎo)致本該被回收的對(duì)象不能被回收而停留在堆內(nèi)存中琅拌,這就產(chǎn)生了內(nèi)存泄漏。
內(nèi)存泄漏會(huì)使我們的應(yīng)用隨著時(shí)間不斷增加,造成應(yīng)用OOM錯(cuò)誤掂林,使應(yīng)用崩潰。
2.為什么有內(nèi)存泄漏
一個(gè)不會(huì)被使用的對(duì)象,因?yàn)榱硪粋€(gè)正在使用的對(duì)象持有該對(duì)象的引用,導(dǎo)致它不能正常被回收,而停留在堆內(nèi)存中,內(nèi)存泄漏就產(chǎn)生了
Android系統(tǒng)為每個(gè)應(yīng)用分配的內(nèi)存是有限的,內(nèi)存泄漏會(huì)使我們的應(yīng)用內(nèi)存隨著時(shí)間不斷的增加,造成應(yīng)用OOM(Out Of Memory)錯(cuò)誤,使應(yīng)用崩潰.
3.內(nèi)存泄漏都有哪些
1.集合類泄漏
(集合類如果僅僅有添加元素的方法坝橡,而沒(méi)有相應(yīng)的刪除機(jī)制泻帮,導(dǎo)致內(nèi)存被占用。
如果這個(gè)集合類是全局性的變量 (比如類中的靜態(tài)屬性计寇,全局性的 map 等即有靜態(tài)引用或 final 一直指向它)锣杂,
那么沒(méi)有相應(yīng)的刪除機(jī)制,很可能導(dǎo)致集合所占用的內(nèi)存只增不減番宁。)
2.單例造成的內(nèi)存泄漏
由于單例的靜態(tài)特性使得其生命周期跟應(yīng)用的生命周期一樣長(zhǎng)元莫,所以如果使用不恰當(dāng)?shù)脑挘苋菀自斐蓛?nèi)存泄漏贝淤。
3.匿名內(nèi)部類/非靜態(tài)內(nèi)部類和異步線程0
非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例造成的內(nèi)存泄漏
4.匿名內(nèi)部類
android開(kāi)發(fā)經(jīng)常會(huì)繼承實(shí)現(xiàn)Activity/Fragment/View柒竞,此時(shí)如果你使用了匿名類政供,
并被異步線程持有了播聪,那要小心了,如果沒(méi)有任何措施這樣一定會(huì)導(dǎo)致泄露
5.Handler 造成的內(nèi)存泄漏
Handler布隔、Message 和 MessageQueue 都是相互關(guān)聯(lián)在一起的离陶,萬(wàn)一 Handler 發(fā)送的 Message 尚未被處理,
則該 Message 及發(fā)送它的 Handler 對(duì)象將被線程 MessageQueue 一直持有衅檀。
Handler 屬于 TLS(Thread Local Storage) 變量, 生命周期和 Activity 是不一致的招刨。
因此這種實(shí)現(xiàn)方式一般很難保證跟 View 或者 Activity 的生命周期保持一致,故很容易導(dǎo)致無(wú)法正確釋放
6.盡量避免使用 static 成員變量
如果你的app進(jìn)程設(shè)計(jì)上是長(zhǎng)駐內(nèi)存的哀军,那即使app切到后臺(tái)沉眶,這部分內(nèi)存也不會(huì)被釋放。按照現(xiàn)在手機(jī)app內(nèi)存管理機(jī)制杉适,
占內(nèi)存較大的后臺(tái)進(jìn)程將優(yōu)先回收谎倔,yi'wei如果此app做過(guò)進(jìn)程互保保活猿推,那會(huì)造成app在后臺(tái)頻繁重啟片习。
當(dāng)手機(jī)安裝了你參與開(kāi)發(fā)的app以后一夜時(shí)間手機(jī)被消耗空了電量、流量蹬叭,你的app不得不被用戶卸載或者靜默藕咏。
7.避免 override finalize()
8.資源未關(guān)閉造成的內(nèi)存泄漏
對(duì)于使用了BraodcastReceiver,ContentObserver秽五,F(xiàn)ile孽查,游標(biāo) Cursor,Stream坦喘,Bitmap等資源的使用卦碾,
應(yīng)該在Activity銷毀時(shí)及時(shí)關(guān)閉或者注銷铺坞,否則這些資源將不會(huì)被回收,造成內(nèi)存泄漏洲胖。
9.一些不良代碼造成的內(nèi)存泄漏
10.線程造成的內(nèi)存泄漏
當(dāng)我們?cè)谑褂镁€程的時(shí)候,一般都使用匿名內(nèi)部類,而匿名內(nèi)部類會(huì)對(duì)外部類持有默認(rèn)的引用,當(dāng)Acticity關(guān)閉之后如果現(xiàn)成中的任務(wù)還沒(méi)有執(zhí)行完畢,就會(huì)導(dǎo)致Activity不能正臣谜ィ回收,造成內(nèi)存泄漏
11.監(jiān)聽(tīng)器沒(méi)有注銷造成的內(nèi)存泄漏
在Android程序里面存在很多需要register與unregister的監(jiān)聽(tīng)器,我們需要確保及時(shí)unregister監(jiān)聽(tīng)器绿映。