亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM中類的初始化及新建過程是怎樣的

發布時間:2021-10-23 16:00:24 來源:億速云 閱讀:111 作者:柒染 欄目:大數據

JVM中類的初始化及新建過程是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

類的狀態變化

類的初始化主要經歷加載->鏈接(驗證,準備,解析)->初始化這些階段,與JVM中相對應的狀態如下圖所示

instanceKlass.hpp

JVM中類的初始化及新建過程是怎樣的

allocated: 已分配,但尚未鏈接

loaded: 已加載,并插入到JVM內部類層次體系中,但尚未鏈接

linked: 已鏈接,但尚未初始化

being_initialized: 初始化中

fully_initialized: 完成初始化

initialization_error: 初始化過程中出錯

加載

.class文件是個二進制文件,我們可以點開.class文件,可以看到各種二進制信息, 右邊轉成的字符不是很全, 有很多標識位,直接用數字表示的. 右邊能看到的, 基本上都是常量池字符串里面的信息

JVM中類的初始化及新建過程是怎樣的

加載.class的源碼在classFileParser.cpp 中,如下圖所示:

JVM中類的初始化及新建過程是怎樣的

在上圖中, 我們可以看到, 有CAFEBABE的定義,版本號的定義, 在往下, 我們可以看到對class文件中的常量池,附錄表等解析方法,在此就不在贅述

鏈接

如我們在out/build 或者別的輸出目錄中所看到的, class文件都是單獨的, class文件中有本類用到的各種靜態常量池. 在jvm中還有一個運行時常量池,是各個class都可以訪問的. 因為鏈接最主要的就是把class文件中的靜態常量池和運行時常量池關聯起來, 把靜態符號引用,轉成直接內存引用, 然后我們就可以通過地址調用相應的方法,完成操作

鏈接有三大步,驗證, 準備,解析.

驗證: 類或接口的二進制信息是否正確, 方法的訪問控制, 變量是否初始化等. 通常來說, 只要我們寫代碼時ide不報錯, 基本上就沒什么問題, 但有些會自己構造.class文件,交由jvm運行, 所以要驗證各種正確性

準備: 在類的準備階段,將為類靜態變量分配內存空間,和賦初始值,但是要注意, 這時候還沒有執行任何賦值的代碼或者靜態代碼塊!

解析: 如上所述, 把class文件中的靜態變量池和jvm內部的運行池給關聯起來, 把符號引用換成直接引用

源碼位置如下圖所示:

JVM中類的初始化及新建過程是怎樣的

clinit 方法

clinit方法是初始化的關鍵所在

這個方法, 我們在java源代碼中沒有看到過,該方法只能由javac 編譯器自動生成和命名,然后自動插入到Class文件中.

clinit方法由編譯器收集類變量(靜態非final),static 代碼塊

clinit方法沒有任何虛擬機字節碼指令可以調用, 它只能在類型初始化階段被虛擬機隱式調用,全程只調用一次

如果有繼承的話,會先初始化父類

其源碼如下:

JVM中類的初始化及新建過程是怎樣的

如上圖所示,有多個步驟,每個步驟的注釋也十分清晰, 強烈建議小伙伴們把源碼拉下來閱讀一下

其實父類優先于子類初始化,可以步驟7和步驟8中看到,如下圖所示:

JVM中類的初始化及新建過程是怎樣的

實例對象的創建

實例對象的創建, 這一塊相對來說就簡單了, 虛擬機遇到new的時候, 從棧頂取得目標對象在常量池中的索引,接著定位到目標類型的類型,接下來,虛擬機看是否已加載采用tlabs/慢速分配(Eden)找一塊空地, 然后完成實例數據和對象頭的初始化.

流程就是上面個流程,其實也沒啥復雜的, 就像我們買東西, 在京東上看了圖片(klass) ,然后就買了一個回來(有自己的實例), 如果快遞配送的很快,還沒來得及想好放哪(還沒加載這個類),那就先丟到倉庫(Eden區),已經想好怎么放的話(已加載了這個類),那就順手就給安排了(使用TLABS來分配).

其中要注意的一點就是.一但選好放哪里之后, 就開始在自己的小本本上更新,XXX東西被我放在了XXX地址. 即使現在還沒有走過去把東西放下, 別人問的時候,已經可以用那個地址去回答別人了.

源碼入口如下圖所示,有興趣的小伙伴,可以沿著這個入口,深入跟蹤下去, 小刀后面也會和大家一起再次看這些地方的! 加油

JVM中類的初始化及新建過程是怎樣的

關于JVM中類的初始化及新建過程是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

渑池县| 克什克腾旗| 民和| 东乡县| 德阳市| 南通市| 印江| 于都县| 定边县| 郁南县| 丰宁| 辉南县| 富平县| 博野县| 营口市| 会理县| 永清县| 霸州市| 怀来县| 阿拉尔市| 镇赉县| 浠水县| 株洲县| 开阳县| 鲁山县| 孙吴县| 保定市| 贺州市| 禹州市| 河曲县| 郯城县| 玉龙| 衡山县| 本溪| 上犹县| 西城区| 利川市| 仁布县| 崇礼县| 泌阳县| 贵港市|