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.物件空間重新分配階段
垃圾回收器對該物件的所佔用的記憶體空間進行回收或者再分配了,則該物件徹底消失了,稱之為“物件空間重新分配階段”。
原文地址:點選開啟連結
相關文章
- Java 中物件的生命週期Java物件
- [Java基礎]物件的生命週期Java物件
- java servlet 生命週期JavaServlet
- Java執行緒的生命週期Java執行緒
- Java類的生命週期淺析Java
- [JAVA] Java物件導向之final、abstract抽象、和變數生命週期Java物件抽象變數
- View生命週期與Activity生命週期的關係View
- Java之執行緒的生命週期Java執行緒
- 生命週期就是指物件的建立到銷燬的期間物件
- 生命週期
- Java虛擬機器(三)垃圾標記演算法與Java物件的生命週期Java虛擬機演算法物件
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- c++臨時物件導致的生命週期問題C++物件
- 品牌生命週期和產品生命週期之間的關係
- JAVA面試題:Spring中bean的生命週期Java面試題SpringBean
- Java開發學習(五)----bean的生命週期JavaBean
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- React新的生命週期React
- iOS APP的生命週期iOSAPP
- Vue生命週期的理解Vue