運(yùn)行時常量池和字符串常量池的區(qū)別及說明
運(yùn)行時常量池和字符串常量池的區(qū)別
常量池
每個class一份,存在于字節(jié)碼文件中。
常量池中有字面量(數(shù)量值、字符串值)和符號引用(類符號引用、字段符號引用、方法符號引用),虛擬機(jī)指令根據(jù)這張常量表找到要執(zhí)行的類名、方法名、參數(shù)類型、字面量等類型
運(yùn)行時常量池
每個class一份,存在于方法區(qū)中(元空間)。
當(dāng)類加載到內(nèi)存中后,jvm就會將class常量池中的內(nèi)容存放到運(yùn)行時常量池中,經(jīng)過解析(resolve)之后,也就是把符號引用替換為直接引用,解析的過程會去查詢?nèi)肿址?,也就是下面的StringTable,以保證運(yùn)行時常量池所引用的字符串與全局字符串池中所引用的是一致的。
字符串常量池
每個JVM中只有一份,存在于方法區(qū)中(堆)。
全局字符串池里的內(nèi)容是在類加載完成,經(jīng)過驗(yàn)證,準(zhǔn)備階段之后在堆中生成字符串對象實(shí)例,然后將該字符串對象實(shí)例的引用值存到string pool中(string pool中存的是引用值而不是具體的實(shí)例對象,具體的實(shí)例對象是在堆中開辟的一塊空間存放的)。
在HotSpot VM里實(shí)現(xiàn)的string pool功能的是一個StringTable類,它是一個哈希表,里面存的是駐留字符串(用雙引號括起來的引用而不是駐留字符串實(shí)例本身),也就是說在堆中的某些字符串實(shí)例被這個StringTable引用之后就等同被賦予了”駐留字符串”的身份。
運(yùn)行時常量池和字符串常量池的關(guān)系
運(yùn)行時常量池是一個統(tǒng)稱 也包括字符串常量池,但是字符串常量池放的只是字符串,而運(yùn)行時常量池中,還包括類信息,屬性信息,方法信息,以及其他基礎(chǔ)類型的的常量池比如int,long等
jdk1.7之前,運(yùn)行時常量池(包含著字符串常量池)都在方法區(qū),具體的hotspot虛擬機(jī)實(shí)現(xiàn)為永久代
jdk1.7階段,字符串常量池從方法區(qū)移到堆中,運(yùn)行池常量池剩下的部分依舊在方法區(qū)(剩下類信息、屬性信息、方法信息等),同樣是hotspot中的永久代
jdk1.8, 方法區(qū)的實(shí)現(xiàn)從永久代變成了元空間,因此 字符串常量池依然在堆中,運(yùn)行時常量池在方法區(qū),hotspot中的元空間(metaspace)
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解springboot+mybatis多數(shù)據(jù)源最簡解決方案
本篇文章主要介紹了詳解springboot+mybatis多數(shù)據(jù)源最簡解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Java連接MYSQL數(shù)據(jù)庫的實(shí)現(xiàn)步驟
以下的文章主要描述的是java連接MYSQL數(shù)據(jù)庫的正確操作步驟,在此篇文章里我們主要是以實(shí)例列舉的方式來引出其具體介紹2013-06-06springboot?整合?dubbo?的實(shí)現(xiàn)組聚合詳情
這篇文章主要介紹了springboot整合dubbo的實(shí)現(xiàn)組聚合詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07SpringMVC自定義參數(shù)綁定實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringMVC自定義參數(shù)綁定實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Java結(jié)合EasyExcel構(gòu)建復(fù)雜多級表頭
在Java開發(fā)中,處理Excel文件時,構(gòu)建復(fù)雜的多級表頭是一項(xiàng)常見且具有挑戰(zhàn)性的任務(wù),下面小編就來和大家聊聊如何通過自定義方法實(shí)現(xiàn)多級表頭的構(gòu)建吧2025-03-03