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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

无招胜有招之Java进阶JVM(七)对象模型

發(fā)布時(shí)間:2024/2/28 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无招胜有招之Java进阶JVM(七)对象模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

Java對象前言:

在jvm的內(nèi)存結(jié)構(gòu)中,對象保存在堆中,而我們在對對象進(jìn)行操作時(shí),其實(shí)操作的是對象的引用。

?

Java對象包含三個(gè)部分:

一個(gè)Java對象可以分為三部分存儲(chǔ)在內(nèi)存中,分別是:對象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)和對齊填充(Padding)。

1.對象頭(包含鎖狀態(tài)標(biāo)志,線程持有的鎖等標(biāo)志)

2.實(shí)例數(shù)據(jù)

3.對齊填充

對象頭:對象頭包括兩部分信息分別是Mark World和元數(shù)據(jù)指針,Mark World用于存儲(chǔ)對象運(yùn)行時(shí)的數(shù)據(jù),比如HashCode、鎖狀態(tài)標(biāo)志、GC分代年齡等。而元數(shù)據(jù)指針用于指向方法區(qū)的中目標(biāo)類的類型信息,通過元數(shù)據(jù)指針可以確定對象的具體類型。

實(shí)例數(shù)據(jù):用于存儲(chǔ)對象中的各種類型的字段信息(包括從父類繼承來的)。

對齊填充:對齊填充不一定存在,起到了占位符的作用,沒有特別的含義。

?

OOP-Klass:

HotSpot中采用了OOP-Klass模型,它是用來描述Java對象實(shí)例的一種模型,OOP(Ordinary Object Pointer)指的是普通對象指針,而Klass用來描述對象實(shí)例的具體類型。

?

【補(bǔ)充】

在Java中,對象的生命周期包括以下幾個(gè)階段:

1.??????創(chuàng)建階段(Created)

2.??????應(yīng)用階段(In Use)

3.??????不可見階段(Invisible)

4.??????不可達(dá)階段(Unreachable)

5.??????收集階段(Collected)

6.??????終結(jié)階段(Finalized)

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

1.創(chuàng)建階段(Created)

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

l? 為對象分配存儲(chǔ)空間

l? 開始構(gòu)造對象

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

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

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

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

?

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

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

?

3.不可見階段(Invisible)

當(dāng)一個(gè)對象處于不可見階段時(shí),說明程序本身不再持有該對象的任何強(qiáng)引用,雖然該這些引用仍然是存在著的。

簡單說就是程序的執(zhí)行已經(jīng)超出了該對象的作用域了。

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


圖2. 不可見階段示例

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

對象處于不可達(dá)階段是指該對象不再被任何強(qiáng)引用所持有。

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

?

5.收集階段(Collected)

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

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

l? 會(huì)影響JVM的對象分配與回收速度

在分配該對象時(shí),JVM需要在垃圾回收器上注冊該對象,以便在回收時(shí)能夠執(zhí)行該重載方法;在該方法的執(zhí)行時(shí)需要消耗CPU時(shí)間且在執(zhí)行完該方法后才會(huì)重新執(zhí)行回收操作,即至少需要垃圾回收器對該對象執(zhí)行兩次GC。

l? 可能造成該對象的再次“復(fù)活”

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

?

6.終結(jié)階段

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

?

7.對象空間重新分配階段

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

摘自:https://blog.csdn.net/moneyshi/article/details/53033578

總結(jié)

以上是生活随笔為你收集整理的无招胜有招之Java进阶JVM(七)对象模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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