常量池、運行時常量池、字符串常量池

常量池、運行時常量池、字符串常量池

Java里包含各種常量池,經(jīng)常傻傻分不清楚,下面就簡單梳理下Java中的池們。

概念解釋

常量池

這里的常量池指的是Class文件常量池。常量池里主要放兩類常量:

  1. 字面量 :Java語言中定義的常量,如使用final修飾的值
  2. 符號引用 :表示JVM定義的Java關鍵字或基本類型與實際結構轉(zhuǎn)換關系

符號引用主要包含以下三種類型:

  1. 類和接口的全限定名(Fully Qualified Name)

  2. 字段的名稱和描述符(Descriptor)

  3. 方法的名稱和描述符

上面說的常量池在JVM中的結構都是一張表。具體有哪些類型的表可以參考下圖

常量池類型表.png

運行時常量池

運行時常量池就是類被JVM加載后在JVM中的版本。有一點兒區(qū)別就是常量池只有類文件在編譯的時候才會產(chǎn)生,而且是存儲在類文件中的。而運行時常量池是在方法區(qū),而且可在JVM運行期間動態(tài)向運行時常量池中寫入數(shù)據(jù)。

字符串常量池

字符串常量池是因為Java為String開辟的一塊內(nèi)存緩沖區(qū),為了提高性能同時減少內(nèi)存開銷。在JVM中,字符串常量池由一個hash表實現(xiàn)。默認容量為1009。當字符串常量池中的存儲比較多的字符串時,會導致hash沖突,從而每個節(jié)點形成長長的鏈表,導致性能下降。所以在使用字符串常量池時,一定要控制容量。

-XX:StringTableSize

通過這個參數(shù)可以指定字符串常量池的容量

不同Jdk中字符串常量池的演化

jdk6及以前字符串常量池中存放的是字符串常量
jdk7字符串常量池中存放的是指定字符串的引用

參考

  • <<深入理解Java虛擬機: JVM高級特性與最佳實踐>>
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ??需要說明的一點是,這篇文章是以《深入理解Java虛擬機》第二版這本書為基礎的,這里假設大家已經(jīng)了解了JVM的運...
    Geeks_Liu閱讀 14,277評論 5 44
  • JVM中的字符串常量池是個有些玄幻的玩意兒,關于它的細節(jié),各類書籍和網(wǎng)站上眾說紛紜。本文試圖參考盡量權威的資料,找...
    LittleMagic閱讀 3,206評論 8 20
  • 概述 在分析字符串常量池之前,先來分析一下java的內(nèi)存區(qū)域,然后再各種的情況分析一下各種情況下的情況; 在《深入...
    riverhh閱讀 874評論 0 2
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡上收集的一些資料的整理,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 16,040評論 3 83
  • 《氣質(zhì)》理想篇 什么樣的事業(yè)、足以讓人在回顧一生辛勞的時候,感到足慰平生的幸福和自豪? 和一支這樣的隊伍在一起?是...
    讀行人聲閱讀 539評論 0 0

友情鏈接更多精彩內(nèi)容