垃圾**的基本思想是考察每乙個物件的可觸及性,即從根節點開始是否可以訪問到這個物件,如果可以,則說明當前物件正在被使用,如果從所有的根節點都無法訪問到某個物件,說明該物件已經不再使用了,一般來說,此物件符合垃圾**的條件。但是,乙個無法觸及的物件有可能在某個條件下復活自己,如果這樣,那麼對它的**就是不合理的,為此,需要給出乙個可觸及性狀態的定義,並規定在什麼狀態下,才可以安全的**物件。
可觸及的包括3種狀態:
以上3種狀態,只有在物件不可觸及時才可以被**。
1 物件的復活
例項1 :前面提到,物件可能在finalize()函式中復活自己,這裡給出乙個例項。
package com.jvm;
public class canreliveobj
@override
public string tostring()
public static void main(string args) throws interruptedexception else
system.out.println("第二次gc");
obj = null;
system.gc();
thread.sleep(1000);
if(obj==null)else}}
執行**列印:
canreliveobj finalize called
obj 可用
第二次gc
obj is null
可以看出,在第一次將obj置為null後,進行gc,結果發現obj物件被復活了。等到第二次再釋放物件引用並執行gc,物件才真正被**。這是因為第一次gc時,在finalize()函式呼叫之前,雖然系統中的引用已經被清除,但是在例項方法finalize()中,物件的引用this依然被傳入方法內部,導致引用外洩,物件復活,此時物件又變成可觸及狀態。由於finalize()函式只會被呼叫一次,因此,在第二次清除釋放物件的引用時,物件就再無機會復活,因此會被**。
注意:
finalize()函式是乙個糟糕的應用模式,不推薦使用finalize()函式釋放資源。
因為:其一,finalize()函式有可能發生引用外洩,在無意間復活物件
其二,由於finalize()是被系統呼叫的,呼叫時間是不明確的,因此不是乙個好的資源釋放方案,推薦使用try-catch-finally語句進行資源的釋放。
誰才是WindowsXP真正的超級管理員
誰才是windows xp真正的超級管理員?windows xp憑藉極高的安全性和穩定性,贏得了廣大使用者的青睞。我們可以通過建立個人賬戶 設定密碼來保護自己的個人隱私,還可以用administrators 超級管理員 的身份任意設定賬戶,為每乙個賬戶設定不同的許可權,可以說擁有至高無上的權利,也擁...
三款大資料工具比拼,誰才是真正的王者
業內有這樣一種說法,sql雖然在大資料分析領域久經考驗,但是無奈長江後浪推前浪,和炙手可熱的hadoop相比,sql已經過時了。這個說法有點言過其實,現在很多的專案都是將hadoop作為資料儲存,然後利用sql進行前端查詢。這說明hadoop需要一種高階查詢語言的支援。hadoop mapreduc...
元素活潑順序 誰才是真正最活潑的金屬?當然不是鉀!
在元素週期表中,第一主族 a 的金屬是最活潑的。這些金屬包括鋰 鈉 鉀 銣 銫 鍅。理論上最活潑的金屬應該是鍅,但由於鍅核不穩定,鍅 223的半衰期最長僅有21分鐘,痕跡量的金屬鍅已經無法完成實驗研究。而與此同時,金屬銫的製備技術已經非常成熟,銫,成為真正意義上的最活潑金屬。金屬銫呈金黃色,熔點很低...