垃圾回收

引用

java強引用,軟引用,弱引用,虛引用

強引用

Java中的引用,有點像C++的指針。通過引用,可以對堆中的對象進行操作。
在某函數中,當創建了一個對象,該對象被分配在堆中,通過這個對象的引用才能對這個對象進行操作。

軟引用

軟引用的強度是僅次于強引用的,如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。
只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

弱引用

弱引用的強度比軟引用更次,也就是說只具有弱引用的對象擁有更短暫的生命周期。
在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。
不過,由于垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。
如果這個對象是偶爾的使用,并且希望在使用時隨時就能獲取到,但又不想影響此對象的垃圾收集,那么你應該用 Weak Reference 來標記此對象。
弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。
當你想引用一個對象,但是這個對象有自己的生命周期,你不想介入這個對象的生命周期,這時候你就是用弱引用。
這個引用不會在對象的垃圾回收判斷中產生任何附加的影響

虛引用

虛引用顧名思義就是形同虛設,虛引用也稱為幻影引用:一個對象是都有虛引用的存在都不會對生存時間都構成影響,也無法通過虛引用來獲取對一個對象的真實引用。
唯一的用處:能在對象被GC時收到系統通知,JAVA中用PhantomReference來實現虛引用。

搞笑的例子

強引用:就像是老板(OOM)的親兒子一樣,在公司可以什么事都不干,但是千萬不要老是占用公司的資源為他自己做事,記得用完公司的妹子之后,要讓她們去工作(資源要懂得釋放) 不然公司很可能會垮掉的。
軟引用:有點像老板(OOM)的親戚,在公司表現不好有可能會被開除,即使你投訴他(調用GC)上班看片,但是只要不被老板看到(被JVM檢測到)就不會被開除(被虛擬機回收)。
弱引用:就是一個普通的員工,平常如果表現不佳會被開除(對象沒有其他引用的情況下),遇到別人投訴(調用GC)上班看片,那開除是肯定了(被虛擬機回收)。
虛引用:這貨估計就是個實習生跟臨時工把,遇到事情的時候想到了你,沒有事情的時候,秒秒鐘拿出去頂鍋,開除。

對比

強引用 never (回收時機) 對象的一般狀態 JVM停止運行(終止)
軟引用 內存不足時候 對象緩存 內存不足
弱引用 GC時 對象緩存 JVM結束
虛引用 。。。 。。。 。。。

GC

jstack

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容