Java中對象的三種狀態

 Java中的對象的三種狀態是和垃圾回收緊密相關的,因此有必要深究。

狀態一:可觸及態:從根節點開始,可以搜索到這個對象,也就是可以訪問到這個對象,也有人將其稱爲可達狀態。

狀態二:可復活態:從根節點開始,無論如何都不能訪問到這個對象,也就是說這個對象的所有引用都被釋放,沒有任何變量引用該對象了,

            但是該對象有可能在finalize()方法中再次被引用,從而復活。

狀態三:不可觸及態:對象的所有引用都被釋放了,並且在對象的finalize()方法中沒有復活,這樣的話該對象就是不可觸及狀態。

 

      對於狀態三我再解釋下,所有對象都有finalize()方法,並且該方法只會被執行一次,並且它的執行時間是隨機的,一般在我們爲變量賦值爲null後,

會執行,如果我們在某個對象的finalize()方法中爲他增加了引用,那麼該對象會復活,但是當我們再次爲其賦值爲null時,finalize()方法不會被執行了,

因爲該方法知執行一次,該對象也就變成了不可觸及態。

 

說到finalize()方法,我再多說點,有的書上寫,可以在finalize()方法中釋放某些資源,其實這並不被我們所推薦,主要有兩點:

     1、finalize()方法執行的時間不確定,那麼這就會導致資源還沒來得及釋放,又有一個線程需要訪問資源,可能會產生異常錯誤。尤其是在多線程程序中。

     2、finalize()方法中可能會發生引用外泄,無意中復活對象,從而產能生內存泄漏。

推薦在try-catch-finally結構的finally塊中釋放資源。

發佈了70 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章