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

JVM源碼分析之Java對象的創(chuàng)建過程

開發(fā) 后端
本文將基于HotSpot實現(xiàn)對Java對象的創(chuàng)建過程進行深入分析。

本文將基于HotSpot實現(xiàn)對Java對象的創(chuàng)建過程進行深入分析。

定義兩個簡單的類AAA和BBB

通過“javap -c AAA“`查看編譯之后的字節(jié)碼,具體如下:

Java中的new關鍵字對應jvm中的new指令,定義在InterpreterRuntime類中,實現(xiàn)如下:

new指令的實現(xiàn)過程:
1、其中pool是AAA的constant pool,此時AAA的class已經(jīng)加載到虛擬機中,new指令后面的#2表示BBB類全限定名的符號引用在constant pool的位置;
2、方法pool->klass_at負責返回BBB對應的klassOop對象,實現(xiàn)如下:

如果常量池中指定位置(#2)的數(shù)據(jù)已經(jīng)是個oop類型,說明BBB的class已經(jīng)被加載并解析過,則直接通過(klassOop)entry.get_oop()返回klassOop;否則表示***次使用BBB,需要解析BBB的符號引用,并加載BBB的class類,生成對應的instanceKlass對象,并更新constant pool中對應位置的符號引用;
3、klass->check_valid_for_instantiation可以防止抽象類被實例化;
4、klass->initialize實現(xiàn)如下:

如果BBB的instanceKlass對象已經(jīng)初始化完成,則直接返回;否則通過initialize_impl方法進行初始化,整個初始化算法分成11步,具體實現(xiàn)如下:

step1

通過ObjectLocker在初始化之前進行加鎖,防止多個線程并發(fā)初始化。

step2

如果當前instanceKlass處于being_initialized狀態(tài),且正在被其它線程初始化,則執(zhí)行ol.waitUninterruptibly等待其他線程完成后通知。

step3

如果當前instanceKlass處于being_initialized狀態(tài),且被當前線程初始化,則直接返回。
其實對于這個step的處理我有疑問,什么情況會走到這一步?經(jīng)過RednaxelaFX大大提點,如下情況會執(zhí)行step3:
例如A類有靜態(tài)變量指向一個new B類實例,B類里又有靜態(tài)變量指向new A類實例,這樣外部用A時要初始化A類,初始化過程中又要觸發(fā)B類初始化,B類初始化又再次觸發(fā)A類初始化。

step4

如果當前instanceKlass處于fully_initialized狀態(tài),說明已經(jīng)初始化完成,則直接返回;

step5

如果當前instanceKlass處于initialization_error狀態(tài),說明初始化失敗了,拋出異常。

step6

設置當前instanceKlass的狀態(tài)為 being_initialized;設置初始化線程為當前線程。

如果當前instanceKlass不是接口類型,并且父類不為空,且還未初始化,則執(zhí)行父類的初始化。

step8

通過this_oop->call_class_initializer方法執(zhí)行靜態(tài)塊代碼,實現(xiàn)如下:

this_oop->class_initializer()可以獲取靜態(tài)代碼塊入口,最終通過JavaCalls::call執(zhí)行代碼塊邏輯,再下一層就是具體操作系統(tǒng)的實現(xiàn)了。

step9

如果初始化過程沒有異常,說明instanceKlass對象已經(jīng)初始完成,則設置當前instanceKlass的狀態(tài)為 fully_initialized,***通知其它線程初始化已經(jīng)完成;否則執(zhí)行step10 and 11。

step10 and 11

如果初始化發(fā)生異常,則設置當前instanceKlass的狀態(tài)為 initialization_error,并通知其它線程初始化發(fā)生異常。

5、如果instanceKlass初始化完成,klass->allocate_instance會在堆內存創(chuàng)建instanceOopDesc對象,即類的實例化;

instanceOopDesc

當在Java中new一個對象時,本質是在堆內存創(chuàng)建一個instanceOopDesc對象。

instanceOopDesc在實現(xiàn)上繼承自oopDesc,其中oopDesc定義如下:

當然,這只是 oopDesc的部分實現(xiàn),oopDesc包含兩個數(shù)據(jù)成員:_mark 和 _metadata。
1、_mark是markOop類型對象,用于存儲對象自身的運行時數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標志、線程持有的鎖、偏向線程ID、偏向時間戳等等,占用內存大小與虛擬機位長一致,更具體的實現(xiàn)可以閱讀 《java對象頭的HotSpot實現(xiàn)分析》
2、_metadata是一個聯(lián)合體,其中wideKlassOop和narrowOop都是指向InstanceKlass對象的指針,wide版是普通指針,narrow版是壓縮類指針(compressed Class pointer)

instanceOopDesc對象的創(chuàng)建過程

instanceOopDesc對象通過instanceKlass::allocate_instance進行創(chuàng)建,實現(xiàn)過程如下:
1、has_finalizer判斷當前類是否包含不為空的finalize方法;
2、size_helper確定創(chuàng)建當前對象需要分配多大內存;
3、CollectedHeap::obj_allocate從堆中申請指定大小的內存,并創(chuàng)建instanceOopDesc對象,實現(xiàn)如下:

4、如果當前類重寫了finalize方法,且非空,需要把生成的對象封裝成Finalizer對象并添加到 Finalizer鏈表中,對象被GC時,如果是Finalizer對象,會將對象賦值到pending對象。Reference Handler線程會將pending對象push到queue中,F(xiàn)inalizer線程poll到對象,先刪除掉Finalizer鏈表中對應的對象,然后再執(zhí)行對象的finalize方法;

責任編輯:張燕妮
相關推薦

2021-03-11 08:10:48

JVM對象的創(chuàng)建School

2022-03-28 11:00:34

JVMJava對象

2011-06-23 15:10:39

Qt 窗體

2017-01-12 14:52:03

JVMFinalRefere源碼

2020-05-26 18:50:46

JVMAttachJava

2017-01-11 14:02:32

JVM源碼內存

2015-11-16 11:22:05

Java對象內存分配

2020-07-21 14:19:18

JVM編程語言

2010-09-27 10:30:42

JVM對象生命周期

2021-03-08 18:08:08

TCP Connect 協(xié)議

2017-01-11 14:19:26

JVM源碼All

2009-12-03 09:59:20

JVM概念Java對象引用類型

2020-10-30 08:35:23

Java Virtua

2019-07-24 08:34:35

Java對象數(shù)據(jù)結構

2011-05-26 10:05:48

MongoDB

2012-09-20 10:07:29

Nginx源碼分析Web服務器

2023-02-26 08:42:10

源碼demouseEffect

2021-03-04 22:31:02

Vue進階函數(shù)

2011-05-26 16:18:51

Mongodb

2010-09-17 13:32:22

JVM.dll
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩在线 | 婷婷综合久久 | 黄色大片在线播放 | 国产成人精品一区二区三区在线 | 欧美激情在线精品一区二区三区 | 欧美三区| 国产精品久久久久无码av | 欧美一级免费片 | 国产精品久久久久久久久久久免费看 | www日本高清 | 欧美精品啪啪 | 四虎影院在线观看av | 国产精品国产精品 | 精品国产免费一区二区三区五区 | 国产一区三区在线 | 日本a在线 | 99国产视频| 国产国产精品 | 欧美日韩高清 | 国产精品小视频在线观看 | 日本一道本视频 | 中文字幕一区二区三区四区五区 | 精品日韩一区 | 在线免费观看黄色 | 亚洲一区视频在线播放 | 欧洲性生活视频 | 久久亚洲欧美日韩精品专区 | 欧美日韩亚洲一区 | 精品国产乱码久久久久久图片 | 国产精品毛片久久久久久久 | 国产精品激情 | 91视频一区二区 | 久久久久一区二区三区 | 中文字幕在线中文 | 亚洲视频中文字幕 | 亚洲一区二区三 | 中文字幕韩在线第一页 | 日韩第一夜 | 天堂一区二区三区 | 天啪| 亚洲国产中文字幕 |