運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說(shuō)明
運(yùn)行時(shí)常量池和字符串常量池的區(qū)別
常量池
每個(gè)class一份,存在于字節(jié)碼文件中。
常量池中有字面量(數(shù)量值、字符串值)和符號(hào)引用(類符號(hào)引用、字段符號(hào)引用、方法符號(hào)引用),虛擬機(jī)指令根據(jù)這張常量表找到要執(zhí)行的類名、方法名、參數(shù)類型、字面量等類型
運(yùn)行時(shí)常量池
每個(gè)class一份,存在于方法區(qū)中(元空間)。
當(dāng)類加載到內(nèi)存中后,jvm就會(huì)將class常量池中的內(nèi)容存放到運(yùn)行時(shí)常量池中,經(jīng)過(guò)解析(resolve)之后,也就是把符號(hào)引用替換為直接引用,解析的過(guò)程會(huì)去查詢?nèi)肿址兀簿褪窍旅娴腟tringTable,以保證運(yùn)行時(shí)常量池所引用的字符串與全局字符串池中所引用的是一致的。
字符串常量池
每個(gè)JVM中只有一份,存在于方法區(qū)中(堆)。
全局字符串池里的內(nèi)容是在類加載完成,經(jīng)過(guò)驗(yàn)證,準(zhǔn)備階段之后在堆中生成字符串對(duì)象實(shí)例,然后將該字符串對(duì)象實(shí)例的引用值存到string pool中(string pool中存的是引用值而不是具體的實(shí)例對(duì)象,具體的實(shí)例對(duì)象是在堆中開(kāi)辟的一塊空間存放的)。
在HotSpot VM里實(shí)現(xiàn)的string pool功能的是一個(gè)StringTable類,它是一個(gè)哈希表,里面存的是駐留字符串(用雙引號(hào)括起來(lái)的引用而不是駐留字符串實(shí)例本身),也就是說(shuō)在堆中的某些字符串實(shí)例被這個(gè)StringTable引用之后就等同被賦予了”駐留字符串”的身份。
運(yùn)行時(shí)常量池和字符串常量池的關(guān)系
運(yùn)行時(shí)常量池是一個(gè)統(tǒng)稱 也包括字符串常量池,但是字符串常量池放的只是字符串,而運(yùn)行時(shí)常量池中,還包括類信息,屬性信息,方法信息,以及其他基礎(chǔ)類型的的常量池比如int,long等
jdk1.7之前,運(yùn)行時(shí)常量池(包含著字符串常量池)都在方法區(qū),具體的hotspot虛擬機(jī)實(shí)現(xiàn)為永久代
jdk1.7階段,字符串常量池從方法區(qū)移到堆中,運(yùn)行池常量池剩下的部分依舊在方法區(qū)(剩下類信息、屬性信息、方法信息等),同樣是hotspot中的永久代
jdk1.8, 方法區(qū)的實(shí)現(xiàn)從永久代變成了元空間,因此 字符串常量池依然在堆中,運(yùn)行時(shí)常量池在方法區(qū),hotspot中的元空間(metaspace)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
記一次springboot配置redis項(xiàng)目啟動(dòng)時(shí)的一個(gè)奇怪的錯(cuò)誤
這篇文章主要介紹了spring?boot配置redis項(xiàng)目啟動(dòng)時(shí)的一個(gè)奇怪的錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot結(jié)合Redis哨兵模式的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot結(jié)合Redis哨兵模式的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Java中StringBuffer和StringBuilder區(qū)別
這篇文章主要介紹了Java中StringBuffer和StringBuilder區(qū)別,本文只介紹了它們之間的核心區(qū)別,需要的朋友可以參考下2015-06-06
maven assembly打包生成Java應(yīng)用啟動(dòng)腳本bat和sh的方法
springboot應(yīng)用通過(guò)maven插件appassembler-maven-plugi生成啟動(dòng)腳本bat和sh,這篇文章主要介紹了maven assembly打包生成Java應(yīng)用啟動(dòng)腳本bat和sh,需要的朋友可以參考下2022-11-11
Java Fluent Mybatis實(shí)戰(zhàn)之構(gòu)建項(xiàng)目與代碼生成篇上
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis2021-10-10
Java實(shí)現(xiàn)讀取及生成Excel文件的方法
這篇文章主要介紹了Java實(shí)現(xiàn)讀取及生成Excel文件的方法,結(jié)合實(shí)例形式分析了java通過(guò)引入第三方j(luò)ar包poi-3.0.1-FINAL-20070705.jar實(shí)現(xiàn)針對(duì)Excel文件的讀取及生成功能,需要的朋友可以參考下2017-12-12

