1. 概念
"萬事萬物皆對象"是Java語音設置之處的理念之一等限∥荼耄《Java編程思想》中寫到:“按照通俗的說法,每個對象都是某個類(class)的實例(instance)握玛,這里够傍,“類”就是“類型”的同義詞”。同時對象調(diào)方法挠铲。
“每種編程語言都有自己的數(shù)據(jù)處理方式冕屯。有些時候,程序員必須注意將要處理的數(shù)據(jù)是什么類型市殷。你是直接操作數(shù)據(jù)愕撰,還是用某種基于特殊語法的間接表示(例如C/C++里的指針)來操作對象。所有這些在Java里面都得到了簡化,一切都被視為對象搞挣。因此带迟,我們可以采用一種統(tǒng)一的語法。盡管將一切都“看作”對象囱桨,但是操縱的標識符實際是指向一個對象的“引用”(reference)”.
2. 引用的類型
在JDK1.2之后仓犬,Java對于引用的感念進行了擴充,將引用分為強引用(Strong Reference)舍肠、軟引用(Soft Reference)搀继、弱引用(Weak Reference)、虛引用(Phantom Reference)四種引用類型翠语。這四種引用類型的引用強度依次逐漸遞減叽躯。
四種引用類型的基本邏輯
3. 各自概念與用法
強引用:
強引用在代碼中普遍的存在,類似與“Object obj = new Object();”只要某個對象有強引用與之關聯(lián)肌括,JVM則無法回收該對象点骑,即使在內(nèi)存不足的情況下,JVM寧愿拋出OutOfMemory錯誤谍夭,也不會回收這種對象黑滴。
軟引用:
軟引用常常用來描述一些有用但是非必需的對象。對于軟引用關聯(lián)的對象紧索,會在JVM內(nèi)存不足時既OutOfMemory之前將這些對象列入回收范圍袁辈,進行二次回收。如果這時回收還是沒有足夠的內(nèi)存才會造成內(nèi)存溢出異常珠漂。在JDK1.2之后晚缩,提供了SoftReference類來實現(xiàn)軟引用。軟引用一般用于網(wǎng)頁的緩存圖片的緩存等等比較耗時的操作甘磨,但是這些操作目前一般使用LruChche來實現(xiàn)橡羞,因此目前代碼中很少見到SoftReference。
弱引用:
弱引用也是用來描述非必要對象的济舆,但是它的輕度比軟引用要弱一些,被弱引用關聯(lián)的對象只能生存到下一次垃圾收集器回收之前莺债,當JVM進行gc操作時滋觉,無論當前內(nèi)存是否足夠,都會回收掉只被弱引用關聯(lián)的對象齐邦。在JDK1.2以后椎侠,提供了WeakReference類來實現(xiàn)弱引用。弱引用的使用范圍也很小措拇,Android 中最常見的是WeakHandler
虛引用
虛引用也稱之為幽靈引用我纪,或者幻影引用,它是最弱的一種引用關系,一個對象是否有虛引用的存在浅悉,完全不會對其生存時間構成影響趟据。也無法通過虛引用來取得一個對象的實例,為一個對象設置為虛引用的唯一目的是希望這個對象被回收器回收時夢收到一個系統(tǒng)通知术健,在JDK1.2之后汹碱,提供了PhantomReference類來實現(xiàn)虛引用。沒有遇到過