Java 對象的生命周期


Java對象的生命周期

         在Java中,對象的生命周期包含下面幾個階段:

1.      創建階段(Created)

2.      應用階段(In Use)

3.      不可見階段(Invisible)

4.      不可達階段(Unreachable)

5.      收集階段(Collected)

6.      終結階段(Finalized)

7.      對象空間重分配階段(De-allocated)

 

圖1. JavaObject Life Cycle

1.創建階段(Created)

在創建階段系統通過以下的幾個步驟來完畢對象的創建過程

  • l  為對象分配存儲空間
  • l  開始構造對象
  • l  從超類到子類對static成員進行初始化
  • l  超類成員變量按順序初始化,遞歸調用超類的構造方法
  • l  子類成員變量按順序初始化,子類構造方法調用

一旦對象被創建,並被分派給某些變量賦值,這個對象的狀態就切換到了應用階段

 

2.應用階段(In Use)

對象至少被一個強引用持有着。

 

3.不可見階段(Invisible)

當一個對象處於不可見階段時,說明程序本身不再持有該對象的不論什么強引用,盡管該這些引用仍然是存在着的。

簡單說就是程序的運行已經超出了該對象的作用域了。

舉比例如以下圖:本地變量count在25行時已經超出了其作用域,則在此時稱之為count處於不可視階段。當然這樣的情況編譯器在編譯的過程中會直接報錯了。


圖2. 不可見階段演示樣例

4.不可達階段(Unreachable)

對象處於不可達階段是指該對象不再被不論什么強引用所持有。

與“不可見階段”相比,“不可見階段”是指程序不再持有該對象的不論什么強引用,這樣的情況下,該對象仍可能被JVM等系統下的某些已裝載的靜態變量或線程或JNI等強引用持有着,這些特殊的強引用被稱為”GC root”。存在着這些GC root會導致對象的內存泄露情況,無法被回收。

 

5.收集階段(Collected)

當垃圾回收器發現該對象已經處於“不可達階段”而且垃圾回收器已經對該對象的內存空間又一次分配做好准備時,則對象進入了“收集階段”。假設該對象已經重寫了finalize()方法,則會去運行該方法的終端操作。

這里要特別說明一下:不要重載finazlie()方法!原因有兩點:

  • l  會影響JVM的對象分配與回收速度

在分配該對象時,JVM須要在垃圾回收器上注冊該對象,以便在回收時可以運行該重載方法;在該方法的運行時須要消耗CPU時間且在運行完該方法后才會又一次運行回收操作,即至少須要垃圾回收器對該對象運行兩次GC。

  • l  可能造成該對象的再次“復活”

在finalize()方法中,假設有其他的強引用再次持有該對象,則會導致對象的狀態由“收集階段”又又一次變為“應用階段”。這個已經破壞了Java對象的生命周期進程,且“復活”的對象不利用興許的代碼管理。


6.終結階段

當對象運行完finalize()方法后仍然處於不可達狀態時,則該對象進入終結階段。在該階段是等待垃圾回收器對該對象空間進行回收。


7.對象空間又一次分配階段

垃圾回收器對該對象的所占用的內存空間進行回收或者再分配了,則該對象徹底消失了,稱之為“對象空間又一次分配階段”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM