常量池舒裤、運(yùn)行時(shí)常量池喳资、字符串常量池
Java里包含各種常量池,經(jīng)常傻傻分不清楚腾供,下面就簡單梳理下Java中的池們仆邓。
概念解釋
常量池
這里的常量池指的是Class文件常量池鲜滩。常量池里主要放兩類常量:
- 字面量 :Java語言中定義的常量,如使用final修飾的值
- 符號引用 :表示JVM定義的Java關(guān)鍵字或基本類型與實(shí)際結(jié)構(gòu)轉(zhuǎn)換關(guān)系
符號引用主要包含以下三種類型:
類和接口的全限定名(Fully Qualified Name)
字段的名稱和描述符(Descriptor)
方法的名稱和描述符
上面說的常量池在JVM中的結(jié)構(gòu)都是一張表节值。具體有哪些類型的表可以參考下圖
常量池類型表.png
運(yùn)行時(shí)常量池
運(yùn)行時(shí)常量池就是類被JVM加載后在JVM中的版本徙硅。有一點(diǎn)兒區(qū)別就是常量池只有類文件在編譯的時(shí)候才會產(chǎn)生,而且是存儲在類文件中的搞疗。而運(yùn)行時(shí)常量池是在方法區(qū)嗓蘑,而且可在JVM運(yùn)行期間動態(tài)向運(yùn)行時(shí)常量池中寫入數(shù)據(jù)。
字符串常量池
字符串常量池是因?yàn)镴ava為String開辟的一塊內(nèi)存緩沖區(qū)匿乃,為了提高性能同時(shí)減少內(nèi)存開銷桩皿。在JVM中,字符串常量池由一個(gè)hash表實(shí)現(xiàn)幢炸。默認(rèn)容量為1009泄隔。當(dāng)字符串常量池中的存儲比較多的字符串時(shí),會導(dǎo)致hash沖突宛徊,從而每個(gè)節(jié)點(diǎn)形成長長的鏈表佛嬉,導(dǎo)致性能下降。所以在使用字符串常量池時(shí)闸天,一定要控制容量暖呕。
-XX:StringTableSize
通過這個(gè)參數(shù)可以指定字符串常量池的容量
不同Jdk中字符串常量池的演化
jdk6及以前字符串常量池中存放的是字符串常量
jdk7字符串常量池中存放的是指定字符串的引用
參考
- <<深入理解Java虛擬機(jī): JVM高級特性與最佳實(shí)踐>>