效能優化 記憶體洩露常見例子

2021-09-16 23:09:03 字數 3013 閱讀 6603

之前說了記憶體洩漏和檢測工具,這裡就記錄一下常見的記憶體洩露有哪些

在舉例子以前,需要明白兩個概念

當呼叫getinstance時,如果傳入的contextactivitycontext。只要這個單利沒有被釋放,那麼這個activity也不會被釋放一直到程序退出才會釋放

public

class

commutil

public

static commutil getinstance

(context mcontext)

return instance;

}}

錯誤的示範:

public

void

loaddata()

catch

(interruptedexception e)}}

}).start()

;}

當呼叫這個方法的時候,這個內部類會持有呼叫方法的類,可能就會造成記憶體洩露

解決方案:將非靜態內部類修改為靜態內部類(靜態內部類不會隱式持有外部類)

public

static

void

loaddata()

catch

(interruptedexception e)}}

}).start()

;}

其實就是非靜態方法的生命周期短於當前類而造成的記憶體洩露

還有另一種情況,執行緒延遲執行的情況,此時已經載入到執行佇列,比如:

public

static

void

loaddata()

catch

(interruptedexception e)}}

},20000);

}

那麼這種情況就需要在ondestroy方法中把timer.cancel掉然後賦空

在使用handler時候也存在這樣的情況,例如

private handler mhandler =

newhandler()

}};

如果在其外部呼叫mhandler.sendemptymessage(0);或者mhandler.sendmessageattime(msg,10000);方法的時候,此時mhandler作為內部類,持有外部類的引用,如果其activity退出,那麼mhandler可能還存在,那麼此時就會一直持有activity,就造成了記憶體洩露

解決辦法:

與其他處理方式一樣,將其設定為靜態內部類

如果在其內部需要使用外部類的資源時,將handler設定為弱引用

private

static

class

myhandler

extends

handler

@override

public

void

handlemessage

(message msg)

switch

(msg.what)

}}

例子1:

final textview tv =

(textview)

findviewbyid

(r.id.tv)

;tv.

setonclicklistener()

;//監聽執行完**物件

tv.getviewtreeobserver()

.addonwindowfocuschangelistener

(new

viewtreeobserver.onwindowfocuschangelistener()

});

如果要設計listenercollector,那麼一般使用weakhashmapweakhashmap除了自身有對key的引用外,此key沒有其他引用那麼此map會自動丟棄此值

public

class

listenercollector

public

static

void

clearlisteners()

例子2:

sensormanager sensormanager =

getsystemservice

(sensor_service)

;sensor sensor = sensormanager.

getdefaultsensor

(sensor.type_all)

;sensormanager.

registerlistener

(this

,sensor,sensormanager.sensor_delay_fastest)

;//不需要用的時候移除監聽

sensormanager.

unregisterlistener

(listener)

;

broadcastreceivercursorbitmapio流自定義屬性attribute

當不需要使用的時候,及時釋放資源,否則就會記憶體洩露

沒有在ondestroy中停止動畫,否則activity就會變成洩露物件,比如:輪播圖效果

常見記憶體洩露問題

1.資源性物件未關閉 資源性物件 如cursor file等一些closeable物件 它們往往使用了緩衝區,緩衝區不僅在jvm內,jvm之外也有。如果僅僅把變數設定為null,而不關閉它們,緩衝區得不到釋放,往往造成記憶體洩露。解決方案 一般在finally中關閉資源型物件,而後設定物件為null...

記憶體洩露和優化

記憶體洩露和優化 概述 通過unityengine命名空間中的介面分配的記憶體,將會通過unity分配在native堆 通過system命名空間中的介面分配的記憶體,將會通過mono runtime分配在mono堆 resources.unloadunusedassets 內部包括gc gc.col...

Android效能優化篇 二 ,記憶體洩露的舉例分析

由於我能力有限,所以不敢稱這是部落格 部落格一般都具有分享性 這只是筆記,所以在寫的過程中我也會盡量描述的清楚些,希望對你有所幫助。當做個人歷程而已。記憶體洩露的根本原因 生命週期長的持有了生命周期短的引用。下面就介紹下,我們平時開發中常見的洩露例子。補充上篇知識 記憶體洩露是說,本該被gc 的記憶...