天天看點

Java 垃圾回收基礎問題

1、Object的finalize()方法的作用是否于C++的析構函數作用相同?

與C++的析構函數不同,析構函數調用确定,而它的是不确定的

将未被引用的對象放置在F-Queue隊列

方法執行随時可能被終止

給予對象最後一次重生的機會

finalize示例

  

  列印結果:

First print: jvm.gc.Finalization@2503dbd3

finalized

Second print:null

jvm.gc.Finalization@2503dbd3

2、Java中的強引用,軟引用,弱引用,虛引用有什麼用

強引用(Strong Reference)

 最普遍的引用: Object obj = new Object()

 抛出OutOfMemoryError終止程式也不會回收具有強引用的對象

 通過将對象設定為null來弱化引用,使其被回收

軟引用(Soft Reference)

對象處在有用但非必須的狀态

隻有當記憶體空間不足時,GC會回收該引用的對象的記憶體

可以用來實作高速緩存

用法如下:

 弱引用(Weak Reference)

非必須的對象,比軟引用更弱一些

GC時會被回收

被回收的機率不大,因為GC線程優先級比較低

适用于引用偶爾被使用且不影響垃圾收集的對象

虛引用(Phantom Reference) (顧名思義,弱引用形同虛設)

不會決定對象的生命周期

任何時候都可能被垃圾收集器回收

跟蹤對象被垃圾收集器回收的活動,起到哨兵作用

必須和引用隊列ReferenceQueue聯合使用

用法如下

總結:四種引用級别

強引用 > 弱引用 > 軟引用 > 虛引用

類的層次結構

引用隊列(ReferenceQueue)

無實際存儲結構,存儲邏輯依賴于内部節點之間的關系來表達

存儲關聯的且被GC的軟引用,弱引用以及虛引用