java類(lèi)型生命周期的詳細(xì)解析
開(kāi)始階段
裝載:把二進(jìn)制形式的java類(lèi)型讀入jvm中。
1)通過(guò)該類(lèi)型的完全限定名,產(chǎn)生一個(gè)代表該類(lèi)型的二進(jìn)制數(shù)據(jù)流;
2)解析這個(gè)二進(jìn)制數(shù)據(jù)流為方法區(qū)內(nèi)的內(nèi)部數(shù)據(jù)結(jié)構(gòu);
3)創(chuàng)建一個(gè)表示該類(lèi)型的java.lang.Class類(lèi)的實(shí)例;
連接:把已讀入的類(lèi)型數(shù)據(jù)合并到虛擬機(jī)的運(yùn)行時(shí)狀態(tài)中。
1)驗(yàn)證:確保java類(lèi)型數(shù)據(jù)格式正確并且適用于jvm使用;
2)準(zhǔn)備:為該類(lèi)型分配內(nèi)存;
3)解析:把常量池中的符號(hào)引用轉(zhuǎn)換為直接引用;
初始化:每個(gè)類(lèi)和接口在首次主動(dòng)使用時(shí)初始化。為類(lèi)變量賦予正確的初始值;
1)如果類(lèi)存在直接超類(lèi),且直接超類(lèi)沒(méi)有被初始化,先初始化直接超類(lèi);
2)如果類(lèi)存在初始化方法,就執(zhí)行此方法;
只有六種活動(dòng)被認(rèn)為是主動(dòng)使用:
1)、創(chuàng)建類(lèi)的新實(shí)例
2)、調(diào)用類(lèi)中聲明的靜態(tài)方法
3)、操作類(lèi)或者接口中聲明的非常量靜態(tài)字段
4)、調(diào)用Java API中特定的反射方法
5)、初始化一個(gè)類(lèi)的子類(lèi)
6)、指定一個(gè)類(lèi)作為jvm啟動(dòng)時(shí)的初始化類(lèi)
使用階段(絕大部分時(shí)間)
實(shí)例化
實(shí)例化途徑
明確實(shí)例化一個(gè)類(lèi)的四種途徑:
1)、new操作符;
2)、調(diào)用Class或者Java.lang.reflect.Constructor對(duì)象的newInstance()方法;
3)、調(diào)用任何現(xiàn)有對(duì)象的Clone()方法;
4)、通過(guò)java.io.ObjectInputStream類(lèi)的getObject()方法反序列化;
隱含實(shí)例化的幾種途徑:
1)、保存命令行參數(shù)的String對(duì)象;
2)、和類(lèi)裝載相關(guān),jvm裝載的每一個(gè)類(lèi)型,會(huì)暗中實(shí)例化一個(gè)Class對(duì)象來(lái)代表這個(gè)類(lèi)型;
3)、和類(lèi)裝載相關(guān),當(dāng)jvm裝載了在常量池中包含CONSTANT_String_info入口類(lèi)的時(shí)候,會(huì)創(chuàng)建新的String對(duì)象的實(shí)例來(lái)表示這些常量字符串;
4)、通過(guò)執(zhí)行包含字符串連接操作符的表達(dá)式產(chǎn)生對(duì)象;
實(shí)例化步驟
1)、在堆中為保存對(duì)象的實(shí)例變量分配內(nèi)存;
2)、為實(shí)例變量初始化為默認(rèn)的初始值;
3)、為實(shí)例變量賦正確的初始值,有三種技術(shù)完成賦值:
a)、如果對(duì)象是clone() 創(chuàng)建的,jvm把原實(shí)例變量中的值拷貝到新對(duì)象中;
b)、如果是通過(guò)ObjectInputStream類(lèi)的readObject()調(diào)用反序列化的,jvm從輸入流中讀取的值來(lái)初始化實(shí)例變量;
c)、jvm調(diào)用對(duì)象的實(shí)例化方法把對(duì)象的實(shí)例變量初始化為正確的初始值;
垃圾收集和對(duì)象終結(jié)
jvm實(shí)現(xiàn)必須具有某種自動(dòng)堆存儲(chǔ)管理策略,大部分是使用垃圾收集器。如果類(lèi)聲明了 void finalize()方法,垃圾收集器在釋放實(shí)例內(nèi)存前會(huì)執(zhí)行這個(gè)方法。
垃圾收集器自動(dòng)調(diào)用的finalize()方法拋出的任何異常都將被忽略。
結(jié)束階段
從jvm中卸載類(lèi)型
很多情況,jvm中類(lèi)的生命周期和對(duì)象的生命周期很相似。jvm如何判斷動(dòng)態(tài)裝載的類(lèi)型是否仍然被程序使用,其判斷方式和判斷對(duì)象是否仍然被使用很相似。
如果程序不再引用某類(lèi)型,那么類(lèi)型就是不可觸及的,就可以被卸載。
使用啟動(dòng)類(lèi)裝載器裝載的類(lèi)型永遠(yuǎn)都是可觸及的,所以永遠(yuǎn)不會(huì)被卸載。只有使用用戶定義的類(lèi)裝載器裝載的類(lèi)型才會(huì)變成不可觸及,才會(huì)被卸載。
相關(guān)文章
使用java為pdf添加書(shū)簽的方法(pdf書(shū)簽制作)
下載一些pdf格式的電子書(shū)沒(méi)有書(shū)簽,用JAVA寫(xiě)了一個(gè)小工具,將特定格式的文本解析成為書(shū)簽,然后保存到pdf格式中2014-02-02VSCode中開(kāi)發(fā)JavaWeb項(xiàng)目的詳細(xì)過(guò)程(Maven+Tomcat+熱部署)
這篇文章主要介紹了VSCode中開(kāi)發(fā)JavaWeb項(xiàng)目(Maven+Tomcat+熱部署),本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09springboot上傳文件,url直接訪問(wèn)資源問(wèn)題
這篇文章主要介紹了springboot上傳文件,url直接訪問(wèn)資源問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05mybatis-plus saveOrUpdateBatch踩坑記錄
這篇文章主要介紹了mybatis-plus saveOrUpdateBatch踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12教你怎么用Java通過(guò)關(guān)鍵字修改pdf
此方法只適合通過(guò)關(guān)鍵字位置,在pdf上添加字符直接上代碼,代碼比較長(zhǎng),大部分自己的理解都在代碼注釋中了,需要的朋友可以參考下2021-05-05詳解IDEA使用Maven項(xiàng)目不能加入本地Jar包的解決方法
這篇文章主要介紹了詳解IDEA使用Maven項(xiàng)目不能加入本地Jar包的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08簡(jiǎn)單捋捋@RequestParam 和 @RequestBody的使用
這篇文章主要介紹了簡(jiǎn)單捋捋@RequestParam 和 @RequestBody的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12IntelliJ IDEA下自動(dòng)生成Hibernate映射文件以及實(shí)體類(lèi)
這篇文章主要介紹了IntelliJ IDEA下自動(dòng)生成Hibernate映射文件以及實(shí)體類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11