成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大話Java對象在虛擬機中是什么樣子?

云計算 虛擬化
JVM本身是用C艸實現的,一個Java對象在是如何映射到C層的對象呢?最簡單的做法是為每個Java類生成一個結構相同c++類與之對應。

 [[321609]]

程序員最不缺的就是對象,每天都會給自己創建成百上千的對象。可是你真的了解你的對象嗎?比如以下類代碼:

 

上面代碼,在main方法中通過 new 關鍵字創建了Foo類的實例對象,并且通過引用 foo 指向這個對象。那么它們以及靜態變量staticValue和實例變量localValue都是被保存在內存中什么位置,以及它們是以何種方式存在的呢?

Java OOP-Klass 模型

JVM本身是用C艸實現的,一個Java對象在是如何映射到C層的對象呢?

最簡單的做法是為每個Java類生成一個結構相同c++類與之對應。

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

之所以采用這個模型是因為HotSopt JVM的設計者不想讓每個對象中都含有一個vtable(虛函數表),所以就把對象模型拆成klass和oop,其中oop中不含有任何虛函數,而Klass就含有虛函數表,可以進行method dispatch。

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

Klass 包含元數據和方法信息,用來描述Java類。

Klass是用來表示class的元數據,包括常量池、字段、方法、類名、父類等。Klass 對象中含有虛函數表vtbl 以及父類虛函數表klass_vtbl, 因此可以根據java對象的實例類型方法的分發。

JVM 在加載class字節碼文件時,會在方法區創建Klass對象,其中 instanceKlass 可以認為是 java.lang.Class 的VM級別的表示,但它們并不等價,其結構如下圖所示,

 

上圖中的所有全局變量會在class字節碼解析階段完成賦值,主要是將常量池中的符號引用轉換為直接引用,即運行時實際內存地址。

OOP 指的是普通對象指針,用來表示對象的實例信息

所有的 OOP 類的共同基類為 oopDesc 類。它的結構如下:

 

當在Java中使用 new guan'jian創建一個對象時,就會在JVM中創建一個 instanceOopDesc 實例對象。Foo中的localValue就是保存在這個對象當中。

我們經常說Java對象在內存中的布局分為:對象頭、實例數據、對其填充。其實這3部分就是對應上面圖中的 oopDesc 對象。

_mark和_metadata 一起組成了對象頭部分:

  • Mark Word:instanceOopDesc 中的 _mark 成員,允許壓縮。它用于存儲對象的運行時記錄信息,如哈希值、GC 分代年齡(Age)、鎖狀態標志(偏向鎖、輕量級鎖、重量級鎖)、線程持有的鎖、偏向線程 ID、偏向時間戳等。
  • 元數據指針:instanceOopDesc 中的 _metadata 成員,它是聯合體,可以表示未壓縮的 Klass 指針(_klass)和壓縮的 Klass 指針。對應的 klass 指針指向一個存儲類的元數據的 Klass 對象。

在對象頭之后,JVM會繼續填充Java對象中的具體實例數據,比如Foo中的localValue。

Foo具體分析

接下來重新回到文章開頭的實例代碼,Foo.java中包含兩個變量staticValue和localValue,但是只有staticValue會在類加載階段由JVM分配內存并初始化默認值,因此當代碼執行到第7行時,內存中只會在方法區創建Klass對象,用來描述Foo信息以及staticValue值,如下圖所示:

 

可以看出,此時堆內存中并沒有創建Foo對應的instanceOopDesc實例對象。

當代碼執行到第9行,調用 new 創建Foo時,JVM 就會創建一個 instanceOopDesc 對象表示這個對象的實例,然后進行 Mark Word 的填充,將元數據指針指向剛才在方法區創建的 Klass 對象,并填充實例變量。并且因為方法是在main方法中執行,所有foo指針會被保存在虛擬機棧中,并指向創建的 instanceOopDesc 對象。具體過程如下:

 

 


 

 

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

綜上所述:

  • foo是一個局部方法中的引用,被保存在虛擬機棧中
  • staticValue靜態變量在類加載階段被保存在方法區,并被賦值
  • localValue 實例變量是在創建對象時才會被創建并賦值
  • 一個Java對象在JVM中被分成2部分:OOP和Klass。其中OOP對象保存對象里實例數據,Klass用來描述類相關信息以及保存靜態變量。

 

責任編輯:武曉燕 來源: 碼癖精阿星
相關推薦

2019-09-03 14:57:33

智慧城市虛擬新加坡3D

2022-05-30 18:54:12

元宇宙Web3數據量

2022-10-10 08:47:49

ITCIO數據

2022-03-15 16:19:13

物聯網物聯網 2.0IoT

2011-10-10 11:04:54

2021-05-27 09:30:51

Java流程控制

2021-10-29 10:55:07

Go 泛型語言

2020-11-16 09:28:41

函數內存

2024-11-13 13:05:02

Python函數對象

2021-05-08 13:11:58

物聯網IOT物聯網技術

2018-11-28 14:53:44

物聯網網關物聯網IOT

2018-04-11 15:22:58

2021-09-14 16:32:11

物聯網IOT

2021-02-19 10:14:49

云計算公共云

2022-04-08 09:59:03

物聯網2.0物聯網

2021-05-31 09:26:01

機器學習人工智能計算機

2021-09-30 19:12:46

通信網絡ADSL

2024-03-04 09:19:33

CSSbackground前端

2022-11-18 10:17:10

2018-01-16 15:02:20

存儲RAIDSAN
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰免费在线 | 国产乱码精品一区二区三区中文 | 免费观看一级毛片 | 成人夜晚看av | 亚洲视频免费播放 | 亚洲精品日韩在线观看 | 日韩三级一区 | 欧美精品导航 | a在线视频| 蜜桃传媒一区二区 | 我想看国产一级毛片 | 一级毛片免费视频 | 国产 欧美 日韩 一区 | 日日夜夜免费精品视频 | 亚洲a视频 | 婷婷中文在线 | 青青激情网 | 精品福利视频一区二区三区 | 国产91丝袜在线熟 | 欧美精品综合在线 | 99视频免费 | 琪琪午夜伦伦电影福利片 | 国产成人精品一区二区三区在线 | 999久久久国产精品 欧美成人h版在线观看 | 精品一区在线 | 99免费精品视频 | 欧美一级电影免费 | 国产免费一区二区 | 欧美精品在线播放 | 欧美日韩在线视频观看 | 懂色中文一区二区三区在线视频 | 九九亚洲精品 | 中文在线a在线 | 亚洲成人一区二区三区 | 亚洲午夜视频在线观看 | 亚洲一区二区在线免费观看 | 亚州国产 | 99re6在线 | 日韩精品成人一区二区三区视频 | 99精品久久久久久 | 日本一区二区高清不卡 |