Java-強,軟菩帝,弱咖城,虛引用

? 1.Android引用之強引用(StrongReference)。

? ? ? 啥是強引用呼奢?舉個例子宜雀,我們平時new 的對象,就都是強引用握础。如: String s =new String(),這就是一個強引用州袒,那么強引用有啥特點呢?

強引用對象弓候,也就是new 出來的那種郎哭,可以直接訪問目標對象。

強引用對象菇存,任何時候都不會被系統(tǒng)回收夸研,jvm寧愿拋出outofmemory.也不會回收強引用所指向的對象,也就是說強引用會導(dǎo)致我們常說的內(nèi)存溢出,比如:強引用在引用對象null時會導(dǎo)致內(nèi)存泄漏依鸥。這里注意區(qū)分內(nèi)存溢出和內(nèi)存泄露的區(qū)別亥至。

2.Android引用之軟引用(SoftReference).

? ? 什么是軟引用呢? 上代碼:

privatevoidsoftReferenceMethod(){

Stringstr =newString("abc");

SoftReference softReference =newSoftReference<>(str);

str=null;

//調(diào)用gc回收

? ? ? ? System.gc();

Log.e(TAG,"softReferenceMethod:----------- "+softReference);

? ? }

? ? ? 使用軟引用引用的對象只有在程序發(fā)生oom異常前才會回收贱迟,也就是說如果內(nèi)存充足永遠不會被回收姐扮,只有在內(nèi)存不足時才會回收,很好的避免oom衣吠,適合做緩存茶敏。

那么如何回收引用對象為空的SoftReference對象呢?

? ? ? ? 通常情況下缚俏,我們會配合ReferenceQueue一起使用惊搏,如果引用對象被GC回收,那么SoftReference對象會被列入ReferenceQueue忧换。也就是說恬惯,ReferenceQueue中保存的對象是Reference對象,而且是已經(jīng)失去了它所軟引用的對象的Reference對象亚茬,ReferenceQueue中有一個poll方法酪耳。當我們調(diào)用當我們調(diào)用它的poll()方法的時候,如果這個隊列中不是空隊列刹缝,那么將返回隊列前面的那個Reference對象碗暗。那就好說了奖蔓,如果我們知道此SoftReference對象還不為空,我們把她清空不就好了嗎讹堤?


結(jié)果:


3.Android引用之弱引用(WeakReference).

? ? 弱引用–>隨時可能會被垃圾回收器回收,不一定要等到虛擬機內(nèi)存不足時才強制回收

使用:

privatevoidweakReferenceMethod(){

Stringstr =newString("abc");

WeakReference weakReference =newWeakReference(str);

str=null;

//調(diào)用gc回收

? ? System.gc();

Log.e(TAG,"softReferenceMethod:----------- "+str);

}

實戰(zhàn): 大家在項目中都經(jīng)常使用Handler吧厨疙,我們今天就用WeakReference來優(yōu)化一下洲守,避免內(nèi)存泄漏。代碼如下:

? ? ? ? 先普及一下:當一個android主線程被創(chuàng)建的時候沾凄,同時會有一個Looper對象被創(chuàng)建梗醇,而這個Looper對象會實現(xiàn)一個MessageQueue(消息隊列),當我們創(chuàng)建一個handler對象時撒蟀,就是從這個消息隊列中放入和取出消息叙谨,每當我們通過handler將一個msg放入消息隊列時,這個msg就會持有一個handler對象的引用保屯。

? ? ? 之所以內(nèi)存泄漏手负,大多是因為非靜態(tài)內(nèi)部類或匿名內(nèi)部類,默認持有外部類的引用姑尺,也就是我們的Handller默認持有MainActivity的引用竟终。那如果activity被finish.這個msg在被取出來之前,這msg會繼續(xù)存活切蟋,但是這個msg持有handler的引用统捶,而handler在Activity中創(chuàng)建,會持有Activity的引用柄粹,因而當Activity結(jié)束后喘鸟,Activity對象并不能夠被gc回收,因而出現(xiàn)內(nèi)存泄漏驻右。但靜態(tài)內(nèi)部類不會持有外部類的引用什黑。所以我們把MyHandller定義為靜態(tài)內(nèi)部類避免引用Activity,但這樣的問題是:之前可以直接使用Activity中的方法,現(xiàn)在不持有外部Activity的引用堪夭,也就沒辦法直接通過方法名調(diào)用了兑凿。看代碼茵瘾,我們是這樣解決的:

? MyHandler myHandler;

? ? WeakReference mWeakReference;

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

//softReferenceMethod();

//weakReferenceMethod();

//初始化操作

mWeakReference=newWeakReference(MainActivity.this);

myHandler=newMyHandler(mWeakReference);

myHandler.sendEmptyMessage(0x111);

? ? }

@Override

protectedvoidonDestroy(){

super.onDestroy();

//為了保險起見礼华,清空所有消息隊列

myHandler.removeCallbacksAndMessages(null);

mWeakReference=null;

? ? }

Handler部分代碼:

privatestaticclassMyHandlerextendsHandler{

? ? ? ? MainActivity mainActivity;

publicMyHandler(WeakReference mainActivityWeakReference){

//通過有參構(gòu)造獲取弱引用對象,進而獲取引用對象

? ? ? ? ? ? mainActivity=mainActivityWeakReference.get();

? ? ? ? }

@Override

publicvoidhandleMessage(Message msg){

super.handleMessage(msg);

switch(msg.what ){

case0x111:

//執(zhí)行具體Activity中的方法

? ? ? ? ? ? ? ? ? mainActivity.doSomething();

break;

? ? ? ? ? ? }

? ? ? ? }

? ? }


? 那么我們什么時候用軟引用拗秘,什么時候用弱引用呢圣絮,因為弱引用隨時可能被回收,而軟引用當內(nèi)存不足時才考慮被回收雕旨。所以如果你的引用對象用完之后不會再次重復(fù)使用扮匠,存在的時間短捧请,想要提高性能,盡快被回收就考慮使用弱引用棒搜,否則軟引用疹蛉。兩者都能很好的避免oom的產(chǎn)生。

4.Android引用之虛引用(PhantonReference).

?

? ? ? 虛引用是所有引用類型中最弱的一個力麸。一個持有虛引用的對象可款,和沒有引用幾乎是一樣的,隨時都可能被垃圾回收器回收克蚂。當試圖通過虛引用的get()方法取得強引用時闺鲸,總是會失敗。并且埃叭,虛引用必須和引用隊列一起使用摸恍,它的作用在于跟蹤垃圾回收過程。 當垃圾回收器準備回收一個對象時赤屋,如果發(fā)現(xiàn)它還有虛引用立镶,就會在垃圾回收后,銷毀這個對象类早,將這個虛引用加入引用隊列谜慌,開發(fā)中,沒怎么多用過莺奔。

? ? ? 好了欣范,簡單就介紹這么多了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末令哟,一起剝皮案震驚了整個濱河市恼琼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屏富,老刑警劉巖晴竞,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狠半,居然都是意外死亡噩死,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門神年,熙熙樓的掌柜王于貴愁眉苦臉地迎上來已维,“玉大人,你說我怎么就攤上這事已日《舛” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堂鲜。 經(jīng)常有香客問我栈雳,道長,這世上最難降的妖魔是什么缔莲? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任哥纫,我火速辦了婚禮,結(jié)果婚禮上痴奏,老公的妹妹穿的比我還像新娘蛀骇。我一直安慰自己,他們只是感情好抛虫,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著简僧,像睡著了一般建椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岛马,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天棉姐,我揣著相機與錄音,去河邊找鬼啦逆。 笑死伞矩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的夏志。 我是一名探鬼主播乃坤,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沟蔑!你這毒婦竟也來了湿诊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瘦材,失蹤者是張志新(化名)和其女友劉穎厅须,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體食棕,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡朗和,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了簿晓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶拉。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憔儿,靈堂內(nèi)的尸體忽然破棺而出镀层,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布唱逢,位于F島的核電站吴侦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坞古。R本人自食惡果不足惜备韧,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痪枫。 院中可真熱鬧织堂,春花似錦、人聲如沸奶陈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃粒。三九已至潦俺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徐勃,已是汗流浹背事示。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僻肖,地道東北人肖爵。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像臀脏,于是被迫代替她去往敵國和親劝堪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容