Java中四種引用類型

強引用

強引用是使用最普遍的引用:Object o=new Object();
特點:不會被GC
將對象的引用顯示地置為null:o=null; 幫助垃圾收集器回收此對象
例如ArrayList的clear()方法的源代碼:

public void clear() {
        modCount++;
        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
    }

軟引用

用來描述一些還有用但是并非必須的對象胀葱,在Java中用java.lang.ref.SoftReference類來表示勺美;對于軟引用關聯(lián)著的對象惶凝,只有在內(nèi)存不足的時候JVM才會回收該對象饲握。因此党远,這一點可以很好地用來解決OOM的問題,并且這個特性很適合用來實現(xiàn)緩存:比如網(wǎng)頁緩存欠气、圖片緩存等铁孵。

User user=new User();
SoftReference softReference=new SoftReference(user);
User user1= (User) softReference.get();

剛才說道當內(nèi)存不足的時候user會被回收,softReference.get()會返回null旧巾,但是softReference本身也是一個強引用耸序,避免太多softReference導致內(nèi)存泄漏,軟引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用鲁猩,如果軟引用所引用的對象被垃圾回收器回收坎怪,Java虛擬機就會把這個軟引用加入到與之關聯(lián)的引用隊列中;從名字可以看出它是一個隊列廓握,我們可以通過這個隊列來把這些失去所軟引用的對象的SoftReference對象清除掉

//聯(lián)合使用
ReferenceQueue queue = new ReferenceQueue();
User user=new User();
SoftReference softReference=new SoftReference(user,queue);
User user1= (User) softReference.get();

//清除的方式
SoftReference ref = null;
while ((ref = (EmployeeRef) q.poll()) != null) {
// 清除ref
}

弱引用

弱引用和軟引用的區(qū)別在于搅窿,弱引用的生命周期很短,在垃圾回收器掃描它管轄的內(nèi)存區(qū)域的過程中疾棵,一旦發(fā)現(xiàn)弱引用對象馬上會被回收戈钢;不過因為垃圾回收器的線程很低痹仙,所以不一定馬上就發(fā)現(xiàn)那些只具有弱引用的對象

虛引用

一個對象是都有虛引用的存在都不會對生存時間都構成影響是尔,也無法通過虛引用來獲取對一個對象的真實引用。唯一的用處:能在對象被GC時收到系統(tǒng)通知开仰,JAVA中用PhantomReference來實現(xiàn)虛引用拟枚。

LruCache

可以利用軟引用、弱引用來實現(xiàn)緩存众弓;但是在Android已經(jīng)提供了一種緩存策略恩溅,LruCache;

LRU(Least Recently Used)緩存算法谓娃,是近期最少使用算法脚乡,它的核心思想是當緩存滿的時候,會優(yōu)先淘汰那些近期最少使用的緩存對象滨达。采用LRU算法的緩存有兩種:LrhCache和DisLruCache奶稠,分別用于實現(xiàn)內(nèi)存緩存和硬盤緩存,其核心思想都是LRU緩存算法捡遍。

使用

//圖片緩存
    private LruCache<String, Bitmap> mImageCache;
    private void initImageCache() {
        //計算可使用的最大內(nèi)存锌订,進程能夠拿到的最大內(nèi)存
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        //取四分之一作為緩存
        int cacheSize = maxMemory / 4;
        mImageCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            //重寫sizeOf方法,計算出要緩存的每張圖片的大小
            protected int sizeOf(String key, Bitmap bitmap) {
                //Bitmap所占用的內(nèi)存空間數(shù)等于Bitmap的每一行所占用的空間數(shù)乘以Bitmap的行數(shù)
                return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
            }
        };
    }
    mImageCache.put(url, bitmap);
    Bitmap bitmap = mImageCache.get(url);

實現(xiàn)原理

LruCache是個泛型類画株,把對象儲存在LinkedHashMap中辆飘;LruCache維護一個緩存對象列表啦辐,對象列表的排列方式是按照訪問順序實現(xiàn)的,最近訪問的對象放在隊尾蜈项,沒被訪問的對象自然被擠到隊頭芹关,隊頭的對象最容易被擠掉,被淘汰

參考文章:

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浇冰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聋亡,更是在濱河造成了極大的恐慌肘习,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坡倔,死亡現(xiàn)場離奇詭異漂佩,居然都是意外死亡,警方通過查閱死者的電腦和手機罪塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門投蝉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人征堪,你說我怎么就攤上這事瘩缆。” “怎么了佃蚜?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵庸娱,是天一觀的道長。 經(jīng)常有香客問我谐算,道長熟尉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任洲脂,我火速辦了婚禮斤儿,結果婚禮上,老公的妹妹穿的比我還像新娘恐锦。我一直安慰自己往果,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布踩蔚。 她就那樣靜靜地躺著棚放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馅闽。 梳的紋絲不亂的頭發(fā)上飘蚯,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天馍迄,我揣著相機與錄音,去河邊找鬼局骤。 笑死攀圈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的峦甩。 我是一名探鬼主播赘来,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凯傲!你這毒婦竟也來了犬辰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤冰单,失蹤者是張志新(化名)和其女友劉穎幌缝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诫欠,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡涵卵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒叼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿偎。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖被廓,靈堂內(nèi)的尸體忽然破棺而出坏晦,到底是詐尸還是另有隱情,我是刑警寧澤伊者,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布英遭,位于F島的核電站间护,受9級特大地震影響亦渗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜汁尺,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一法精、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痴突,春花似錦搂蜓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拾积,卻和暖如春殉挽,著一層夾襖步出監(jiān)牢的瞬間丰涉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工斯碌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留一死,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓傻唾,卻偏偏與公主長得像投慈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冠骄,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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