在 java 中,常量池分為以下三種:
一、class 常量池1. 是什么? 是class文件中的資源倉庫。我們的 class 文件,用十六進(jìn)制編輯器( notepad++ 安裝 Hex-editor )打開,可以發(fā)現(xiàn)它第二行的內(nèi)容是這樣的:
每個(gè) class 文件用十六進(jìn)制編輯器打開,開頭都是 cafe babe,這個(gè)叫魔數(shù)。那么剩下的是什么意思呢?
看到?jīng)],這里就有常量池。啊這,我說它是就是,我說就一定對嗎?我們可以使用如下命令,查看字節(jié)碼文件:
執(zhí)行之后會(huì)看到: ![]() 看吧,我是不會(huì)騙你的! 2. 位置: 既然說了是 class 常量池,那它就是在 class 文件中。 3. 保存的數(shù)據(jù): class 常量池保存的東西主要有以下兩類:
二、字符串常量池1. 是什么? 顧名思義,就是用來保存字符串的常量池。為了提高執(zhí)行效率、節(jié)省內(nèi)存開銷,從而整了個(gè)字符串常量池來緩存字符串?dāng)?shù)據(jù)。關(guān)于 String 的詳細(xì)介紹,請參考我另一篇文章 String類相關(guān)面試題很難?不要方,問題不大。 2. 位置:
三、運(yùn)行時(shí)常量池1. 是什么? 當(dāng) class 文件通過 ClassLoader 加載到 JVM 內(nèi)存時(shí),會(huì)把 class 常量池 中的內(nèi)容加載到方法區(qū)的一塊內(nèi)存中,這塊內(nèi)存就叫運(yùn)行時(shí)常量池。 2. 位置: 運(yùn)行時(shí)常量池在方法區(qū)中,jdk 1.7 極其之前方法區(qū)的實(shí)現(xiàn)叫永久代,jdk 1.8 開始叫元空間。 |
|