在Java中镜沽,對象的生命周期包括以下幾個階段:
- 創(chuàng)建階段(Created)
- 應(yīng)用階段(In Use)
- 不可見階段(Invisible)
- 不可達(dá)階段(Unreachable)
- 收集階段(Collected)
- 終結(jié)階段(Finalized)
- 對象空間重分配階段(De-allocated)
1. 創(chuàng)建階段(Created)
在創(chuàng)建階段系統(tǒng)通過下面的幾個步驟來完成對象的創(chuàng)建過程
- 為對象分配存儲空間
- 開始構(gòu)造對象
- 從超類到子類對static成員進(jìn)行初始化
- 超類成員變量按順序初始化春缕,遞歸調(diào)用超類的構(gòu)造方法
- 子類成員變量按順序初始化挎塌,子類構(gòu)造方法調(diào)用
一旦對象被創(chuàng)建,并被分派給某些變量賦值车酣,這個對象的狀態(tài)就切換到了應(yīng)用階段
2. 應(yīng)用階段(In Use)
對象至少被一個強引用持有著曲稼。
3. 不可見階段(Invisible)
當(dāng)一個對象處于不可見階段時索绪,說明程序本身不再持有該對象的任何強引用,雖然該這些引用仍然是存在著的贫悄。
簡單說就是程序的執(zhí)行已經(jīng)超出了該對象的作用域了瑞驱。
舉例如下圖:本地變量count在25行時已經(jīng)超出了其作用域,則在此時稱之為count處于不可視階段窄坦。當(dāng)然這種情況編譯器在編譯的過程中會直接報錯了钱烟。
boolean has = false;
while (has) {
int count = 0;
count ++;
}
//1
System.out.println(count);
4. 不可達(dá)階段(Unreachable)
對象處于不可達(dá)階段是指該對象不再被任何強引用所持有。
與“不可見階段”相比嫡丙,“不可見階段”是指程序不再持有該對象的任何強引用,這種情況下读第,該對象仍可能被JVM等系統(tǒng)下的某些已裝載的靜態(tài)變量或線程或JNI等強引用持有著曙博,這些特殊的強引用被稱為”GC root”。存在著這些GC root會導(dǎo)致對象的內(nèi)存泄露情況怜瞒,無法被回收父泳。
5. 收集階段(Collected)
當(dāng)垃圾回收器發(fā)現(xiàn)該對象已經(jīng)處于“不可達(dá)階段”并且垃圾回收器已經(jīng)對該對象的內(nèi)存空間重新分配做好準(zhǔn)備時,則對象進(jìn)入了“收集階段”吴汪。如果該對象已經(jīng)重寫了finalize()方法惠窄,則會去執(zhí)行該方法的終端操作。
這里要特別說明一下:不要重載finazlie()方法漾橙!原因有兩點:
會影響JVM的對象分配與回收速度
在分配該對象時杆融,JVM需要在垃圾回收器上注冊該對象,以便在回收時能夠執(zhí)行該重載方法霜运;在該方法的執(zhí)行時需要消耗CPU時間且在執(zhí)行完該方法后才會重新執(zhí)行回收操作脾歇,即至少需要垃圾回收器對該對象執(zhí)行兩次GC。
可能造成該對象的再次“復(fù)活”
在finalize()方法中淘捡,如果有其它的強引用再次持有該對象藕各,則會導(dǎo)致對象的狀態(tài)由“收集階段”又重新變?yōu)椤皯?yīng)用階段”。這個已經(jīng)破壞了Java對象的生命周期進(jìn)程焦除,且“復(fù)活”的對象不利用后續(xù)的代碼管理激况。
6. 終結(jié)階段
當(dāng)對象執(zhí)行完finalize()方法后仍然處于不可達(dá)狀態(tài)時,則該對象進(jìn)入終結(jié)階段膘魄。在該階段是等待垃圾回收器對該對象空間進(jìn)行回收乌逐。
7. 對象空間重新分配階段
垃圾回收器對該對象的所占用的內(nèi)存空間進(jìn)行回收或者再分配了,則該對象徹底消失了瓣距,稱之為“對象空間重新分配階段”黔帕。
轉(zhuǎn)載:
Java 對象的生命周期