自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

大話Java對(duì)象在虛擬機(jī)中是什么樣子?

云計(jì)算 虛擬化
JVM本身是用C艸實(shí)現(xiàn)的,一個(gè)Java對(duì)象在是如何映射到C層的對(duì)象呢?最簡(jiǎn)單的做法是為每個(gè)Java類生成一個(gè)結(jié)構(gòu)相同c++類與之對(duì)應(yīng)。

 [[321609]]

程序員最不缺的就是對(duì)象,每天都會(huì)給自己創(chuàng)建成百上千的對(duì)象??墒悄阏娴牧私饽愕膶?duì)象嗎?比如以下類代碼:

 

上面代碼,在main方法中通過(guò) new 關(guān)鍵字創(chuàng)建了Foo類的實(shí)例對(duì)象,并且通過(guò)引用 foo 指向這個(gè)對(duì)象。那么它們以及靜態(tài)變量staticValue和實(shí)例變量localValue都是被保存在內(nèi)存中什么位置,以及它們是以何種方式存在的呢?

Java OOP-Klass 模型

JVM本身是用C艸實(shí)現(xiàn)的,一個(gè)Java對(duì)象在是如何映射到C層的對(duì)象呢?

最簡(jiǎn)單的做法是為每個(gè)Java類生成一個(gè)結(jié)構(gòu)相同c++類與之對(duì)應(yīng)。

但HotSpot JVM并沒(méi)有這么做,而是設(shè)計(jì)了一個(gè)OOP-Klass Model。這里的 OOP 指的是 Ordinary Object Pointer (普通對(duì)象指針),它用來(lái)表示對(duì)象的實(shí)例信息。而 Klass 則包含元數(shù)據(jù)和方法信息,用來(lái)描述Java類。

之所以采用這個(gè)模型是因?yàn)镠otSopt JVM的設(shè)計(jì)者不想讓每個(gè)對(duì)象中都含有一個(gè)vtable(虛函數(shù)表),所以就把對(duì)象模型拆成klass和oop,其中oop中不含有任何虛函數(shù),而Klass就含有虛函數(shù)表,可以進(jìn)行method dispatch。

OOP-Klass模型 分為OOP框架和Klass框架

Klass 包含元數(shù)據(jù)和方法信息,用來(lái)描述Java類。

Klass是用來(lái)表示class的元數(shù)據(jù),包括常量池、字段、方法、類名、父類等。Klass 對(duì)象中含有虛函數(shù)表vtbl 以及父類虛函數(shù)表klass_vtbl, 因此可以根據(jù)java對(duì)象的實(shí)例類型方法的分發(fā)。

JVM 在加載class字節(jié)碼文件時(shí),會(huì)在方法區(qū)創(chuàng)建Klass對(duì)象,其中 instanceKlass 可以認(rèn)為是 java.lang.Class 的VM級(jí)別的表示,但它們并不等價(jià),其結(jié)構(gòu)如下圖所示,

 

上圖中的所有全局變量會(huì)在class字節(jié)碼解析階段完成賦值,主要是將常量池中的符號(hào)引用轉(zhuǎn)換為直接引用,即運(yùn)行時(shí)實(shí)際內(nèi)存地址。

OOP 指的是普通對(duì)象指針,用來(lái)表示對(duì)象的實(shí)例信息

所有的 OOP 類的共同基類為 oopDesc 類。它的結(jié)構(gòu)如下:

 

當(dāng)在Java中使用 new guan'jian創(chuàng)建一個(gè)對(duì)象時(shí),就會(huì)在JVM中創(chuàng)建一個(gè) instanceOopDesc 實(shí)例對(duì)象。Foo中的localValue就是保存在這個(gè)對(duì)象當(dāng)中。

我們經(jīng)常說(shuō)Java對(duì)象在內(nèi)存中的布局分為:對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)其填充。其實(shí)這3部分就是對(duì)應(yīng)上面圖中的 oopDesc 對(duì)象。

_mark和_metadata 一起組成了對(duì)象頭部分:

  • Mark Word:instanceOopDesc 中的 _mark 成員,允許壓縮。它用于存儲(chǔ)對(duì)象的運(yùn)行時(shí)記錄信息,如哈希值、GC 分代年齡(Age)、鎖狀態(tài)標(biāo)志(偏向鎖、輕量級(jí)鎖、重量級(jí)鎖)、線程持有的鎖、偏向線程 ID、偏向時(shí)間戳等。
  • 元數(shù)據(jù)指針:instanceOopDesc 中的 _metadata 成員,它是聯(lián)合體,可以表示未壓縮的 Klass 指針(_klass)和壓縮的 Klass 指針。對(duì)應(yīng)的 klass 指針指向一個(gè)存儲(chǔ)類的元數(shù)據(jù)的 Klass 對(duì)象。

在對(duì)象頭之后,JVM會(huì)繼續(xù)填充Java對(duì)象中的具體實(shí)例數(shù)據(jù),比如Foo中的localValue。

Foo具體分析

接下來(lái)重新回到文章開頭的實(shí)例代碼,F(xiàn)oo.java中包含兩個(gè)變量staticValue和localValue,但是只有staticValue會(huì)在類加載階段由JVM分配內(nèi)存并初始化默認(rèn)值,因此當(dāng)代碼執(zhí)行到第7行時(shí),內(nèi)存中只會(huì)在方法區(qū)創(chuàng)建Klass對(duì)象,用來(lái)描述Foo信息以及staticValue值,如下圖所示:

 

可以看出,此時(shí)堆內(nèi)存中并沒(méi)有創(chuàng)建Foo對(duì)應(yīng)的instanceOopDesc實(shí)例對(duì)象。

當(dāng)代碼執(zhí)行到第9行,調(diào)用 new 創(chuàng)建Foo時(shí),JVM 就會(huì)創(chuàng)建一個(gè) instanceOopDesc 對(duì)象表示這個(gè)對(duì)象的實(shí)例,然后進(jìn)行 Mark Word 的填充,將元數(shù)據(jù)指針指向剛才在方法區(qū)創(chuàng)建的 Klass 對(duì)象,并填充實(shí)例變量。并且因?yàn)榉椒ㄊ窃趍ain方法中執(zhí)行,所有foo指針會(huì)被保存在虛擬機(jī)棧中,并指向創(chuàng)建的 instanceOopDesc 對(duì)象。具體過(guò)程如下:

 

 


 

 

可以看出 localValue 是被保存在堆中的。

綜上所述:

  • foo是一個(gè)局部方法中的引用,被保存在虛擬機(jī)棧中
  • staticValue靜態(tài)變量在類加載階段被保存在方法區(qū),并被賦值
  • localValue 實(shí)例變量是在創(chuàng)建對(duì)象時(shí)才會(huì)被創(chuàng)建并賦值
  • 一個(gè)Java對(duì)象在JVM中被分成2部分:OOP和Klass。其中OOP對(duì)象保存對(duì)象里實(shí)例數(shù)據(jù),Klass用來(lái)描述類相關(guān)信息以及保存靜態(tài)變量。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼癖精阿星
相關(guān)推薦

2019-09-03 14:57:33

智慧城市虛擬新加坡3D

2022-05-30 18:54:12

元宇宙Web3數(shù)據(jù)量

2011-10-10 11:04:54

2022-03-15 16:19:13

物聯(lián)網(wǎng)物聯(lián)網(wǎng) 2.0IoT

2022-10-10 08:47:49

ITCIO數(shù)據(jù)

2021-05-27 09:30:51

Java流程控制

2020-11-16 09:28:41

函數(shù)內(nèi)存

2021-10-29 10:55:07

Go 泛型語(yǔ)言

2024-11-13 13:05:02

Python函數(shù)對(duì)象

2021-02-19 10:14:49

云計(jì)算公共云

2018-04-11 15:22:58

2021-09-14 16:32:11

物聯(lián)網(wǎng)IOT

2022-04-08 09:59:03

物聯(lián)網(wǎng)2.0物聯(lián)網(wǎng)

2018-11-28 14:53:44

物聯(lián)網(wǎng)網(wǎng)關(guān)物聯(lián)網(wǎng)IOT

2021-05-08 13:11:58

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2021-05-31 09:26:01

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2018-01-16 15:02:20

存儲(chǔ)RAIDSAN

2014-04-08 09:56:30

銷售易CRM

2020-11-04 11:17:20

好代碼程序員整潔

2021-11-29 07:42:44

CSS 技巧CSS 繪圖技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)