首先需要理解下Java的class文件,以及class文件結構:
1.Class文件是一組以8個字節(jié)為基礎單位的二進制流,各個數(shù)據項目嚴格按照順序緊湊地排列在文 件之中,中間沒有任何分隔符,這使得整個Class文件中存儲的內容幾乎全部是程序運行的必要數(shù)據,沒有空隙存在。當遇到需要占用8個字節(jié)以上空間的數(shù)據項時,則會按照高位在前的方式分割 成若干個8個字節(jié)進行存儲
??? 注: 任何一個Class文件都對應著唯一的一個類或接口的定義信息,但是反過來說,類或 接口并不一定都得定義在文件里(譬如類或接口也可以動態(tài)生成,直接送入類加載器中)
2.Class文件格式采用類c語言結構體的偽結構來存儲數(shù)據
??????????? 結構:
????????????????????? a. 無符號數(shù)
????????????????????? b. 表
????? a.無符號數(shù)屬于基本數(shù)據類型,u1:代表1個字節(jié)無符號數(shù),有四個參數(shù) u1, u2, u4, u8。 它們們用來描述數(shù)組,索引引用,數(shù)量值或字符串
????? b. 表:無符號數(shù)或者其他表作為數(shù)據項構成的復合數(shù)據類型,為了便于區(qū)分,所有表的命名 都習慣性地以“_info”結尾。表用于描述有層次關系的復合結構的數(shù)據,整個Class文件本質上也可以視 作是一張表,這張表由下圖所示的數(shù)據項按嚴格順序排列構成
?3. 圖中的constant_poll 即常量池,是class中的表結構(類型cp_info)
?4. 常量池可以比喻為class文件存放的資源倉庫,它是class結構中與其他項目引用最多的數(shù)據,通常也是占用class文件空間最大的數(shù)據項目之一
?5. 常量池入口為u2類型數(shù)據,為常量池容量計數(shù)值,常量池中有21項常量。索引范圍1~21
?6. 常量池存放類型:
???? a. 字面量(Literal)
???? b. 符號引用(Symbolic References)
?? 字面量: 文本字符串,聲明為final的常量值等
?? 符號引用:
??????????????????? ·被模塊導出或者開放的包(Package)
??????????????????? ·類和接口的全限定名(Fully Qualified Name)
??????????????????? ·字段的名稱和描述符(Descriptor)
????????????????? ? ·方法的名稱和描述符
??????????????????? ·方法句柄和方法類型(Method Handle、Method Type、Invoke Dynamic)
??????????????????? ·動態(tài)調用點和動態(tài)常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)
7. class文件不會保存方法,或字段的值而是通過常量池進行轉換使用。虛擬機進行類加載時,從常量池獲取到字面量(一些常量值),符號引用(指針引用數(shù)據),在類創(chuàng)建或運行時解析,從常量池拿到這些數(shù)據,到具體的內存地址之中。(我認為與將代碼中的魔法值,類似1,2,字符串等抽出來,單獨放到一個類中類似,常量池就是做這個的)
8.常量池每一項常量都是一個表,截止jdk13,一共有17種不同類型常量:
文章來源:http://www.zghlxwxcb.cn/news/detail-670758.html
9. 總結來說,常量池就是存儲類中(編譯后的class文件):字符串的值,final常量,方法引用,方法描述,方法類型等的表結構文章來源地址http://www.zghlxwxcb.cn/news/detail-670758.html
到了這里,關于jvm 什么是常量池,常量池定義 class常量池的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!