日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02.字符串常量池 ? class常量池? 运行时常量池?

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02.字符串常量池 ? class常量池? 运行时常量池? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java對(duì)象創(chuàng)建流程:

簡(jiǎn)介:

這幾天在看Java虛擬機(jī)方面的知識(shí)時(shí),看到了有幾種不同常量池的說法,然后我就去CSDN、博客園等上找資料,里面說的內(nèi)容真是百花齊放,各自爭(zhēng)艷,因此,我好好整理了一下,將我自認(rèn)為對(duì)的理解寫下來與大家共同探討:

在Java的內(nèi)存分配中,總共3種常量池:

1.字符串常量池(String Constant Pool):

1.1:字符串常量池在Java內(nèi)存區(qū)域的哪個(gè)位置?


在JDK6.0及之前版本,字符串常量池是放在Perm Gen區(qū)(也就是方法區(qū))中;
在JDK7.0版本,字符串常量池被移到了堆中了。至于為什么移到堆內(nèi),大概是由于方法區(qū)的內(nèi)存空間太小了。


1.2:字符串常量池是什么?


在HotSpot VM里實(shí)現(xiàn)的string pool功能的是一個(gè)StringTable類,它是一個(gè)Hash表,默認(rèn)值大小長(zhǎng)度是1009;這個(gè)StringTable在每個(gè)HotSpot VM的實(shí)例只有一份,被所有的類共享。字符串常量由一個(gè)一個(gè)字符組成,放在了StringTable上。
在JDK6.0中,StringTable的長(zhǎng)度是固定的,長(zhǎng)度就是1009,因此如果放入String Pool中的String非常多,就會(huì)造成hash沖突,導(dǎo)致鏈表過長(zhǎng),當(dāng)調(diào)用String#intern()時(shí)會(huì)需要到鏈表上一個(gè)一個(gè)找,從而導(dǎo)致性能大幅度下降;
在JDK7.0中,StringTable的長(zhǎng)度可以通過參數(shù)指定:


-XX:StringTableSize=666661

?

1.3:字符串常量池里放的是什么?


在JDK6.0及之前版本中,String Pool里放的都是字符串常量;
在JDK7.0中,由于String#intern()發(fā)生了改變,因此String Pool中也可以存放放于堆內(nèi)的字符串對(duì)象的引用。關(guān)于String在內(nèi)存中的存儲(chǔ)和String#intern()方法的說明,可以參考我的另外一篇博客:

?


需要說明的是:字符串常量池中的字符串只存在一份!
?如:

String s1 = "hello,world!";
String s2 = "hello,world!";12

?

即執(zhí)行完第一行代碼后,常量池中已存在? “hello,world!”,那么 s2不會(huì)在常量池中申請(qǐng)新的空間,而是直接把已存在的字符串內(nèi)存地址返回給s2。(這里具體的字符串如何分配就不細(xì)說了,可以看我的另一篇博客)

?

2.class常量池(Class Constant Pool):

?

2.1:class常量池簡(jiǎn)介:

?


我們寫的每一個(gè)Java類被編譯后,就會(huì)形成一份class文件;class文件中除了包含類的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息就是常量池(constant pool table),用于存放編譯器生成的各種字面量(Literal)和符號(hào)引用(Symbolic References);
每個(gè)class文件都有一個(gè)class常量池。

?


2.2:什么是字面量和符號(hào)引用:

?


字面量包括:1.文本字符串 2.八種基本類型的值 3.被聲明為final的常量等;
符號(hào)引用包括:1.類和方法的全限定名 2.字段的名稱和描述符 3.方法的名稱和描述符。

?


3.運(yùn)行時(shí)常量池(Runtime Constant Pool):


運(yùn)行時(shí)常量池存在于內(nèi)存中,也就是class常量池被加載到內(nèi)存之后的版本,不同之處是:它的字面量可以動(dòng)態(tài)的添加(String#intern()),符號(hào)引用可以被解析為直接引用
JVM在執(zhí)行某個(gè)類的時(shí)候,必須經(jīng)過加載、連接、初始化,而連接又包括驗(yàn)證、準(zhǔn)備、解析三個(gè)階段。而當(dāng)類加載到內(nèi)存中后,jvm就會(huì)將class常量池中的內(nèi)容存放到運(yùn)行時(shí)常量池中,由此可知,運(yùn)行時(shí)常量池也是每個(gè)類都有一個(gè)。在解析階段,會(huì)把符號(hào)引用替換為直接引用,解析的過程會(huì)去查詢字符串常量池,也就是我們上面所說的StringTable,以保證運(yùn)行時(shí)常量池所引用的字符串與字符串常量池中是一致的。
?

?

總結(jié)

以上是生活随笔為你收集整理的02.字符串常量池 ? class常量池? 运行时常量池?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。