劍指Offer(GC)——常見面試題

1、Object的finalize()方法是否與C++的析構函數一樣

答案肯定是否定的,finalize調用是確定的而析構函數調用是不確定的。

一個Java方法經過第一次可達性分析時候發現沒和GC Root相連,就去判斷是否被finalize覆蓋,如果被覆蓋放進F-Queue隊列中,然後JVM的finalize去回收這個方法。缺點是finalize覆蓋的方法隨時都可能會被終結而不是等到運行結束後,意義是給予對象最後一次重生的機會。

接下來驗證一下,首先創建一個對象打印出來是沒有問題的,手動觸發gc會觸發finalize方法,打印出Finalized,f是因爲上面進行了賦值變成了null,finalization屬性將該對象重新賦值最後打印出f地址。

出現的問題可能是:gc還沒有執行完(finalize方法沒有執行完成)就開始執行下面的程序,最後打印出的f.finalization就是null,這個時候需要加個sleep以保證gc完整執行完成。
在這裏插入圖片描述

2、Java中強引用、軟引用、弱引用、虛引用之間的區別

(1)、強引用

是最普遍的一種引用,創建實例時經常使用的一種引用:

Object object = new Object();

最後即使可能會因爲內存不足拋出OOM導致終止程序,也不會收回強引用產生的對象實例。若果想要回收強引用對象的實例需要將對象設置成null來弱化引用使其被回收。

(2)、軟引用

是一種相對強引用弱一些的引用,只有當JVM內存不足的時候纔會去回收軟引用指向的對象。
JVM確定拋出OOM異常之前清理軟引用指向的對象,軟引用通常用來實現內存敏感的高速緩存,如果還有空閒的內存就會在暫時保留內存,內存不足時候清理掉這樣保證了使用緩存同時不會耗盡內存。

String str = new String("abc");//強引用
SoftReference<String> softRef = new SoftReference<String>(str);//軟引用

(3)、弱引用

相比起軟引用還要弱一些,在GC的時候會被直接回收,但是由於GC線程執行優先級是比較低的因此回收的概率不是很大,適用於引用被偶爾引用但是不影響垃圾收集的對象。

String str = new String("abc");
WeakReference<String> wr = new WeakReference<String>(str);

(4)、虛引用

虛引用不會影響對象的生命週期會在任何時候都有可能被垃圾回收,主要作用是用於跟蹤對象被垃圾回收器回收的活動,哨兵的作用,但是需要和ReferenceQueue聯合起來使用。

String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(str,queue);

GC時候發現虛引用的情況,首先將其加入到引用隊列中程序可以判斷引用隊列的對象就能判斷這個對象是否被垃圾回收。
在這裏插入圖片描述
在這裏插入圖片描述

(5)、引用隊列

是沒有實際的存儲結構,存儲邏輯依賴於內部節點的關係來表達。
存儲關聯的且被GC的軟引用,弱引用以及虛引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章