之前說了記憶體洩漏和檢測工具,這裡就記錄一下常見的記憶體洩露有哪些
在舉例子以前,需要明白兩個概念
當呼叫getinstance
時,如果傳入的context
是activity
的context
。只要這個單利沒有被釋放,那麼這個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
,那麼一般使用weakhashmap
,weakhashmap
除了自身有對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)
;
broadcastreceiver
、cursor
、bitmap
、io流
、自定義屬性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 的記憶...