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的軟引用,弱引用以及虛引用