JVM - Class常量池 || 运行时常量池
文章目錄
- Pre
- class常量池
- 字面量
- 符號(hào)引用
- 運(yùn)行時(shí)常量池
Pre
JVM - 深入剖析字符串常量池
JVM - 基本類型的包裝類和對(duì)象池
class常量池
Class常量池我們可以理解為是Class文件中的資源倉(cāng)庫(kù)。
Class文件中主要由兩大部分
- 類的版本、字段、方法、接口等描述信息外,
- 常量池(constant pool table),用于存放編譯期生成的各種字面量(Literal)和符號(hào)引用(Symbolic References)。
我們來(lái)看下我們天天打交道的class文件十六進(jìn)制的樣子 大致如下
基本含義
通常都是 javap 來(lái)生成可讀的字節(jié)碼文件來(lái)查看。
或者在idea中裝個(gè) jclasslib插件 查看
這里面主要是兩個(gè)東西; 字面量和符號(hào)引用
字面量
么錯(cuò) 就是你想的那個(gè)意思: 由字母、數(shù)字等構(gòu)成的字符串或者數(shù)值常量 。
比如
int a = 1; int b = 2; String c = "artisan"; String d = "art123";符號(hào)引用
符號(hào)引用是編譯原理中的概念,是相對(duì)于直接引用來(lái)說(shuō)的。主要包括了以下三類常量:
- 類和接口的全限定名
- 字段的名稱和描述符
- 方法的名稱和描述符
剛剛上面的代碼
a、b 、c、d就是字段名稱,就是一種符號(hào)引用,
類的全限定名也是符號(hào)引用,
類中的方法名稱,()是一種UTF8格式的描述符,這些都是符號(hào)引用。
運(yùn)行時(shí)常量池
class常量池現(xiàn)在是靜態(tài)信息,只有到運(yùn)行時(shí)被加載到內(nèi)存后,這些符號(hào)才有對(duì)應(yīng)的內(nèi)存地址信息,這些常量池一旦被裝入內(nèi)存就變成運(yùn)行時(shí)常量池,對(duì)應(yīng)的符號(hào)引用在程序加載或運(yùn)行時(shí)會(huì)被轉(zhuǎn)變?yōu)楸患虞d到內(nèi)存區(qū)域的代碼的直接引用,也就是我們說(shuō)的動(dòng)態(tài)鏈接了。
舉個(gè)例子哈,methodA()這個(gè)符號(hào)引用在運(yùn)行時(shí)就會(huì)被轉(zhuǎn)變?yōu)閙ethodA()方法具體代碼在內(nèi)存中的地址,主要通過(guò)對(duì)象頭里的類型指針去轉(zhuǎn)換直接引用。
總結(jié)
以上是生活随笔為你收集整理的JVM - Class常量池 || 运行时常量池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JVM - 一个案例反推不同JDK版本的
- 下一篇: APM - Hello Javaage