日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java对象生命周期_Java对象生命周期和类生命周期

發(fā)布時(shí)間:2025/3/21 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java对象生命周期_Java对象生命周期和类生命周期 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:Java對(duì)象生命周期和類生命周期

作者:彭空空

鏈接:https://www.jianshu.com/p/25ea857ba78b

導(dǎo)讀

對(duì)象的生命周期

類的加載機(jī)制

類的生命周期

類加載器

對(duì)象的生命周期

對(duì)象的整個(gè)生命周期大致可以分為7個(gè)階段:

創(chuàng)建階段(Creation)

應(yīng)用階段(In Use)

不可視階段(Invisible)

不可達(dá)階段(Unreachable)

可收集階段(Collected)

終結(jié)階段(Finalized)

對(duì)象空間重分配階段(De-allocated)

image 創(chuàng)建階段(Creation)

一個(gè)Java類至少有一個(gè)父類Object(除了Object類本身),這個(gè)規(guī)則既是強(qiáng)制的,也是隱式的。你可能已經(jīng)注意到在創(chuàng)建一個(gè)Java類的時(shí)候,并沒有顯式地聲明擴(kuò)展(extends)一個(gè)Object父類。

1//TempA的聲明等同于TempB

2publicclassTempA{ }

3publicclassTempBextendsjava.lang.Object{ }

在創(chuàng)建階段系統(tǒng)通過以下的幾個(gè)步驟來完成對(duì)象的創(chuàng)建過程:

為對(duì)象分配存儲(chǔ)空間

開始構(gòu)造對(duì)象

從超類到子類對(duì)static成員進(jìn)行初始化

超類成員變量按順序初始化,遞歸調(diào)用超類的構(gòu)造方法

子類成員變量按順序初始化,子類構(gòu)造方法調(diào)用

一旦對(duì)象被創(chuàng)建,并被分派給某些變量賦值,這個(gè)對(duì)象的狀態(tài)就切換到了應(yīng)用階段

應(yīng)用階段(Using)

對(duì)象至少被一個(gè)強(qiáng)引用持有著。

不可視階段(Invisible)

當(dāng)一個(gè)對(duì)象處于不可見階段時(shí),說明程序本身不再持有該對(duì)象的任何強(qiáng)引用,但是這些引用可能還存在著,**一般具體是指程序的執(zhí)行已經(jīng)超過該對(duì)象的作用域了。

1boolean bool= false;

2if( bool){

3intcount = 0;

4count++;

5}

6System. out.println(count);

本地變量count在System.out.println(count)時(shí)已經(jīng)超出了其作用域,則在此時(shí)稱之為count處于不可視階段。當(dāng)然這樣的情況編譯器在編譯的過程中會(huì)直接報(bào)錯(cuò)了。

不可達(dá)階段(Unreachable)

對(duì)象處于不可達(dá)階段是指該對(duì)象不再被任何強(qiáng)引用所持有,該對(duì)象仍可能被JVM等系統(tǒng)下的某些已裝載的靜態(tài)變量或線程或JNI等強(qiáng)引用持有著,這些特殊的強(qiáng)引用被稱為”GC root”。存在著這些GC root會(huì)導(dǎo)致對(duì)象的內(nèi)存泄露情況,無法被回收。

可收集階段(Collected)

當(dāng)垃圾回收器發(fā)現(xiàn)該對(duì)象已經(jīng)處于“不可達(dá)階段”而且垃圾回收器已經(jīng)對(duì)該對(duì)象的內(nèi)存空間又一次分配做好準(zhǔn)備時(shí),則對(duì)象進(jìn)入了“收集階段”。假設(shè)該對(duì)象已經(jīng)重寫了finalize方法,則會(huì)去運(yùn)行該方法的終端操作。

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

會(huì)影響JVM的對(duì)象分配與回收速度 在分配該對(duì)象時(shí),JVM須要在垃圾回收器上注冊(cè)該對(duì)象,以便在回收時(shí)可以運(yùn)行該重載方法;在該方法的運(yùn)行時(shí)須要消耗CPU時(shí)間且在運(yùn)行完該方法后才會(huì)又一次運(yùn)行回收操作,即至少須要垃圾回收器對(duì)該對(duì)象運(yùn)行兩次GC。

可能造成該對(duì)象的再次“復(fù)活” 在finalize方法中,假設(shè)有其他的強(qiáng)引用再次持有該對(duì)象,則會(huì)導(dǎo)致對(duì)象的狀態(tài)由“收集階段”又又一次變?yōu)椤皯?yīng)用階段”。這個(gè)已經(jīng)破壞了Java對(duì)象的生命周期進(jìn)程,且“復(fù)活”的對(duì)象不利用興許的代碼管理。

終結(jié)階段(Finalized)

當(dāng)對(duì)象運(yùn)行完finalize方法后仍然處于不可達(dá)狀態(tài)時(shí),則該對(duì)象進(jìn)入終結(jié)階段。在該階段是等待垃圾回收器對(duì)該對(duì)象空間進(jìn)行回收。

對(duì)象空間重分配階段(De-allocated)

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

類的加載機(jī)制

類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類的加載的最終產(chǎn)品是位于堆區(qū)中的Class對(duì)象,Class對(duì)象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。

類加載器并不需要等到某個(gè)類被“首次主動(dòng)使用”時(shí)再加載它,JVM規(guī)范允許類加載器在預(yù)料某個(gè)類將要被使用時(shí)就預(yù)先加載它,如果在預(yù)先加載的過程中遇到了.class文件缺失或存在錯(cuò)誤,類加載器必須在程序首次主動(dòng)使用該類時(shí)才報(bào)告錯(cuò)誤(LinkageError錯(cuò)誤)如果這個(gè)類一直沒有被程序主動(dòng)使用,那么類加載器就不會(huì)報(bào)告錯(cuò)誤

加載.class文件的方式

從本地系統(tǒng)中直接加載

通過網(wǎng)絡(luò)下載.class文件

從zip,jar等歸檔文件中加載.class文件

從專有數(shù)據(jù)庫中提取.class文件

將Java源文件動(dòng)態(tài)編譯為.class文件

類的生命周期

image

Java虛擬機(jī)為Java程序提供運(yùn)行時(shí)環(huán)境,其中一項(xiàng)重要的任務(wù)就是管理類和對(duì)象的生命周期。類的生命周期從類被加載、連接和初始化開始,到類被卸載結(jié)束。當(dāng)類處于生命周期中時(shí),它的二級(jí)制數(shù)據(jù)位于方法區(qū)內(nèi),在堆區(qū)中還會(huì)有一個(gè)相應(yīng)的描述這個(gè)類的Class對(duì)象(當(dāng)Java程序使用任何一個(gè)類時(shí),系統(tǒng)都會(huì)為之創(chuàng)建一個(gè)java.lang.Class對(duì)象)。只有當(dāng)類處于生命周期中時(shí),Java程序才能使用它,比如調(diào)用類的靜態(tài)成員或者創(chuàng)建類的實(shí)例。

當(dāng)Java程序需要使用某個(gè)類時(shí),Java虛擬機(jī)會(huì)確保這個(gè)類已經(jīng)被加載、連接和初始化。其中連接過程又包括驗(yàn)證、準(zhǔn)備和解析這三個(gè)子步驟。這些步驟必須嚴(yán)格按照以下順序執(zhí)行。

加載:查找并加載類的二進(jìn)制數(shù)據(jù)

查找并加載類的二進(jìn)制數(shù)據(jù)加載時(shí)類加載過程的第一個(gè)階段,在加載階段,虛擬機(jī)需要完成以下三件事情:

通過一個(gè)類的全限定名來獲取其定義的二進(jìn)制字節(jié)流。

將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。

在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為對(duì)方法區(qū)中這些數(shù)據(jù)的訪問入口。

相對(duì)于類加載的其他階段而言,加載階段(準(zhǔn)確地說,是加載階段獲取類的二進(jìn)制字節(jié)流的動(dòng)作)是可控性最強(qiáng)的階段,因?yàn)殚_發(fā)人員既可以使用系統(tǒng)提供的類加載器來完成加載,也可以自定義自己的類加載器來完成加載。

加載階段完成后,虛擬機(jī)外部的二進(jìn)制字節(jié)流就按照虛擬機(jī)所需的格式存儲(chǔ)在方法區(qū)之中,而且在Java堆中也創(chuàng)建一個(gè)java.lang.Class類的對(duì)象,這樣便可以通過該對(duì)象訪問方法區(qū)中的這些數(shù)據(jù)。

連接:包括驗(yàn)證、準(zhǔn)備和解析類的二進(jìn)制數(shù)據(jù)

驗(yàn)證:確保被加載類的正確性

當(dāng)類被加載后,就進(jìn)入驗(yàn)證階段。連接就是把已經(jīng)讀入到內(nèi)存中的類的二進(jìn)制數(shù)據(jù)合并到JVM運(yùn)行時(shí)環(huán)境中去。連接的第一步是類的驗(yàn)證,其目的是保證被加載的類由正確的內(nèi)部結(jié)構(gòu),并且與其他類協(xié)調(diào)一致。如果JVM檢查到錯(cuò)誤,那么就會(huì)拋出相應(yīng)的Error對(duì)象。

準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值

解析:把類中的符號(hào)引用轉(zhuǎn)換成直接引用

初始化

如果一個(gè)類被直接引用,就會(huì)觸發(fā)類的初始化。在java中,直接引用的情況有:

通過new關(guān)鍵字實(shí)例化對(duì)象、讀取或設(shè)置類的靜態(tài)變量、調(diào)用類的靜態(tài)方法。

通過反射方式執(zhí)行以上三種行為。

初始化子類的時(shí)候,會(huì)觸發(fā)父類的初始化。

作為程序入口直接運(yùn)行時(shí)(也就是直接調(diào)用main方法)。

除了以上四種情況,其他使用類的方式叫做被動(dòng)引用,而被動(dòng)引用不會(huì)觸發(fā)類的初始化。

卸載

在類使用完之后,如果滿足下面的情況,類就會(huì)被卸載:

該類所有的實(shí)例都已經(jīng)被回收,也就是java堆中不存在該類的任何實(shí)例。

加載該類的ClassLoader已經(jīng)被回收

該類對(duì)應(yīng)的java.lang.Class對(duì)象沒有任何地方被引用,無法在任何地方通過反射- 訪問該類的方法

jvm(java虛擬機(jī))中的幾個(gè)比較重要的內(nèi)存區(qū)域

方法區(qū):在java的虛擬機(jī)中有一塊專門用來存放已經(jīng)加載的類信息、常量、靜態(tài)變量以及方法代碼的內(nèi)存區(qū)域,叫做方法區(qū)。

常量池:常量池是方法區(qū)的一部分,主要用來存放常量和類中的符號(hào)引用等信息。

堆區(qū):用于存放類的對(duì)象實(shí)例。

棧區(qū):也叫java虛擬機(jī)棧,是由一個(gè)一個(gè)的棧幀組成的后進(jìn)先出的棧式結(jié)構(gòu),棧楨中存放方法運(yùn)行時(shí)產(chǎn)生的局部變量、方法出口等信息。當(dāng)調(diào)用一個(gè)方法時(shí),虛擬機(jī)棧中就會(huì)創(chuàng)建一個(gè)棧幀存放這些數(shù)據(jù),當(dāng)方法調(diào)用完成時(shí),棧幀消失,如果方法中調(diào)用了其他方法,則繼續(xù)在棧頂創(chuàng)建新的棧楨。

類加載器(Calssloader)

image

未完待續(xù)。。。

文獻(xiàn)

https://www.cnblogs.com/9513-/p/8456877.html

https://www.cnblogs.com/wangxilei/p/9617637.html

https://www.cnblogs.com/damon9094/p/8881185.html

https://blog.csdn.net/m0_38075425/article/details/81627349返回搜狐,查看更多

責(zé)任編輯:

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的java对象生命周期_Java对象生命周期和类生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。