為什么會(huì)發(fā)生內(nèi)存泄露州藕?
? ? ?當(dāng)一個(gè)對(duì)象已經(jīng)不需要再使用本該被回收時(shí),另外一個(gè)正在使用的對(duì)象持有它的引用從而導(dǎo)致它不能被回收,這導(dǎo)致本該被回收的對(duì)象不能被回收而停留在堆內(nèi)存中篱竭,這就產(chǎn)生了內(nèi)存泄漏癌刽。
常見的內(nèi)存泄露
1役首、資源未關(guān)閉造成的內(nèi)存泄漏?
2、集合容器中的內(nèi)存泄露
3显拜、線程造成的內(nèi)存泄漏
4衡奥、非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例造成的內(nèi)存泄漏
如何避免內(nèi)存泄露?
1远荠、在涉及使用Context時(shí)矮固,對(duì)于生命周期比Activity長(zhǎng)的對(duì)象應(yīng)該使用Application的Context。凡是使用Context優(yōu)先考慮Application的Context譬淳,當(dāng)然它并不是萬能的档址,對(duì)于有些地方則必須使用Activity的Context。對(duì)于Application邻梆,Service守伸,Activity三者的Context的應(yīng)用場(chǎng)景如下:
其中,NO1表示Application和Service可以啟動(dòng)一個(gè)Activity浦妄,不過需要?jiǎng)?chuàng)建一個(gè)新的task任務(wù)隊(duì)列尼摹。而對(duì)于Dialog而言,只有在Activity中才能創(chuàng)建剂娄。除此之外三者都可以使用蠢涝。
2、對(duì)于需要在靜態(tài)內(nèi)部類中使用非靜態(tài)外部成員變量(如:Context阅懦、View )和二,可以在靜態(tài)內(nèi)部類中使用弱引用來引用外部類的變量來避免內(nèi)存泄漏。
3耳胎、對(duì)于不再需要使用的對(duì)象惯吕,顯示的將其賦值為null,比如使用完Bitmap后先調(diào)用recycle()怕午,再賦為null混埠。
4、保持對(duì)對(duì)象生命周期的敏感诗轻,特別注意單例钳宪、靜態(tài)對(duì)象、全局性集合等的生命周期。
5吏颖、對(duì)于生命周期比Activity長(zhǎng)的內(nèi)部類對(duì)象搔体,并且內(nèi)部類中使用了外部類的成員變量,可以這樣做避免內(nèi)存泄漏:
1)將內(nèi)部類改為靜態(tài)內(nèi)部類
2)靜態(tài)內(nèi)部類中使用弱引用來引用外部類的成員變量