中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

JVM虛擬機中Class文件的常量池是什么

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

這期內容當中小編將會給大家帶來有關JVM虛擬機中Class文件的常量池是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、常量池的作用

在class文件中的魔數、副版本號、主版本之后,緊接著就是常量池的數據區域了,如下圖用紅線包括的位置:

JVM虛擬機中Class文件的常量池是什么

常量池可以比喻為Class文件里的資源倉庫,它是Class 文件結構中與其他項目關聯最多的數據,通常也是占用Class文件空間最大的數據項目之一,另外,它還是在Class文件中第一個出現的表類型數據項目。

二、常量池的結構

常量池的結構比較簡單,前面的兩個字節叫做常量池計數器(constantpoolcount),它記錄了常量池項(cpinfo)的個數。后面緊接著就是constantpoolcount-1常量池項(cpinfo)。這跟報文通信協議比較類似,首先定義報文的大小,接著就是對應大小的報文內容。

JVM虛擬機中Class文件的常量池是什么

JVM虛擬機中Class文件的常量池是什么

由于常量池中常量的數量是不固定的,所以在常量池的入口需要放置一項u2類型的數據,代表常量池容量計數值(constantpoolcount)。與Java中語言習慣不同,這個容量計數是從1而不是0開始的,如上圖所示,常量池容量(偏移地址:0x00000008)為十六進制數0x0021,即十進制的33,這就代表常量池中有33項常量,索引值范圍為1~33。在Class文件格式規范制定之時,設計者將第0項常量空出來是有特殊考慮的,這樣做的目的在于,如果后面某些指向常量池的索引值的數據在特定情況下需要表達“不引用任何一個常量池項目”的含義,可以把索引值設置為0來表示。Class文件結構中只有常量池的容量計數是從1開始,對于其他集合類型,包括接口索引集合、字段表集合、方法表集合等的容量計數都與一般習慣相同,是從0開始。

三、常量池的分類

常量池中主要存放兩大類常量: 字面量(Literal)和符號引用(SymbolicReferences)。字面量比較接近于Java語言層面的常量概念,如文本字符串、被聲明為final的常量值等;而符號引用則屬于編譯原理方面的概念。具體分類如下圖:

JVM虛擬機中Class文件的常量池是什么

常量池中每一項常量都是一個表,最初常量表中共有11種結構各不相同的表結構數據,后來為了更好地支持動態語言調用,額外增加了4種動態語言相關的常量,為了支持Java模塊化系統 (Jigsaw),又加入了CONSTANTM oduleinfo和CONSTANTPackageinfo兩個常量,所以截至JDK 13,常量表中分別有17種不同類型的常量。這17類表都有一個共同的特點,表結構起始的第一位是個u1類型的標志位(tag,取值見下表中標志列),代表著當前常量屬于哪種常量類型。

官網最新:http://cr.openjdk.java.net/~jrose/jvm/constant-dynamic-jrose.html

JVM虛擬機中Class文件的常量池是什么

JVM虛擬機中Class文件的常量池是什么

我們對這個class文件進行分析,可以看到前8個字節是該class文件的魔數和版本號,緊接著的一個十六進制數0x0021,即十進制的33,這就代表z這個class文件的常量池中有32項常量,索引值為1~32。然后就是第一個常量了,上面說過,每種類型的常量開始的第一位都是一個u1類型的標志位,代表該常量的類型,這里是0x0a,十進制的10,查上面的表可知是CONSTANTMethodrefinfo,說明這個常量是類中方法的符號應用。該類型常量的具體結構為:

JVM虛擬機中Class文件的常量池是什么

第一個index值為0x0004,即指向常量池中的第4個常量,第二個index是0x0019,即指向常量池中的第25個常量。在JDK的bin目錄中,Oracle公司已經為我們準備好一個專門用于分析Class文件字節碼的工具:javap。我們可以用javap -verbose命令查看class文件的字節碼內容。

JVM虛擬機中Class文件的常量池是什么

可以看到和我們分析的一致,該class文件中確實有32項常量,從#1到#32。

四、17種數據類型結構總表

JVM虛擬機中Class文件的常量池是什么

JVM虛擬機中Class文件的常量池是什么

上述就是小編為大家分享的JVM虛擬機中Class文件的常量池是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

苏尼特右旗| 唐河县| 新密市| 宝坻区| 荣成市| 朝阳区| 陇南市| 武乡县| 永清县| 保靖县| 元江| 阜康市| 芒康县| 陇南市| 西林县| 东安县| 分宜县| 尼勒克县| 灵寿县| 曲阳县| 南江县| 定兴县| 来宾市| 大竹县| 鄂尔多斯市| 腾冲县| 旌德县| 彭州市| 合水县| 邢台市| 房产| 原阳县| 芒康县| 阿合奇县| 堆龙德庆县| 商城县| 松滋市| 桂平市| 达州市| 兰考县| 将乐县|