深入淺出JVM常量池

常量池在JVM中分為三種:字符串常量池,運行時常量池,Class常量池
討論范圍 JDK 1.7版本及以后

字符串常量池(String pool)
(1)什么是字符串常量池?
①字符串常量由一個個字符組成。在HotSpot虛擬機中,字符串常量池是有一個名為 StringTable 的類來實現的,StringTable是一個哈希表HashSet<String>,默認長度為1009,是被所有類共享的,因此在JVM中的實例只有一份。注意它只存儲對java.lang.String實例的引用,而不存儲String對象的內容,根據這個引用可以得到具體的String對象。一般我們說一個字符串進入了全局的字符串常量池其實是說在這個StringTable中保存了對它的引用,反之,如果說沒有在其中就是說StringTable中沒有對它的引用。

②在JDK1.6版本中,StringTable的長度是固定的,長度就是1009。因此如果保存的字符串常量過多,就會造成哈希沖突,導致鏈表過長,而鏈表過長的直接影響就是 當調用String.intern時性能會大幅下降(因為要一個一個找)。

③在JDK1.7版本中,StringTable的長度可以通過參數來指定:-XX:StringTableSize=123456

(2)字符串常量池保存在JVM哪個區域?
在JDK1.6及之前的版本中,字符串常量池是放在永久代(Perm Gen)中,確切來講是永久代的方法區中。
在JDK1.7后的版本中,字符串常量池就被移到了堆(Heap)中。之所以會被移到堆中,可能是方法區的內存空間太小了。

(3)字符串常量池中保存的是什么?
字符串常量池只存儲引用,不存儲內容!字符串不是存在字符串常量池中而是存在堆內存中,字符串池中只是該字符串的引用。
規范里把存儲Java對象的地方定義為Java heap,其它地方是不會存有Java對象的實體的(有的話那根據定于也要算Java heap的一部分)

注:在字符串常量池中的字符串只能存在一份。

String s1 ="JVM";
String s2 ="JVM";
//執行完第一段代碼后,由于常量池中已經存在了"JVM"這個字符串的引用,
//所以s2不會在常量池中申請新的空間,而是直接把已存在的字符串內存地址返回給s2。

Class常量池
(1)什么是Class常量池?
①在每一個Java類被編譯后,會形成一個class文件。Class文件除了有類信息,字段,方法,接口等描述信息,還有一項信息是常量池(Constant Pool Table),每一個class文件都有一個class常量池。

(2)Class常量池保存在JVM哪個區域?
保存在堆中。

(3)Class常量池中保存的是什么?
用于存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References);
字面量(Literal)包括:文本字符串,八種基本類型的值,被聲明為final的常量等
符號引用(Symbolic References)包括:類和接口的全限定名(Full Qualified Name),字段的名稱和描述符(Descriptor),方法的名稱和描述符

運行時常量池(Runtime Constant Pool)
(1)什么是運行時常量池?
運行時常量池,則是jvm虛擬機在完成類裝載操作后,將class文件中的常量池載入到內存中,并保存在方法區中。 運行時常量池也就是class常量池被加載到內存之后的版本,因為每一個class文件都有一個class常量池,因此運行時常量池也是每個類都有一個。我們常說的常量池,就是指方法區中的運行時常量池。

運行時常量池相對于Class文件常量池的重要特征是具有動態性。除了在編譯器產生的常量可以進入運行時常量池外,還可以在運行期間將新的常量放入池中,比如String 的 intern方法。

(2)運行時常量池保存在JVM哪個區域?
位于方法區,Java虛擬機規范中將方法區描述為堆的邏輯部分,所以實際上還是在堆中。

(3)Class常量池中保存的是什么?
方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有常量池(Constant Pool Table),存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后進入方法區的運行時常量池。也就是說運行時常量池是class常量池的另一個版本。

但是,這個“進入”過程,并不會直接把所有類中定義的常量全部都加載進來,而是會做個比較,如果需要加到字符串常量池中的字符串已經存在,那么就不需要再把字符串字面量加載進來了。

推薦閱讀
https://www.zhihu.com/question/29884421
https://www.zhihu.com/question/57109429/answer/151717241
https://www.zhihu.com/question/55994121/answer/147296098
https://blog.csdn.net/zm13007310400/article/details/77534349

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容

  • ??需要說明的一點是,這篇文章是以《深入理解Java虛擬機》第二版這本書為基礎的,這里假設大家已經了解了JVM的運...
    Geeks_Liu閱讀 14,047評論 5 44
  • 這篇文章是我之前翻閱了不少的書籍以及從網絡上收集的一些資料的整理,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 15,650評論 3 83
  • 本文跟大家聊聊JVM的內部結構,從組件中的多線程處理,JVM系統線程,局部變量數組等方面進行解析 JVM JVM ...
    認真期待閱讀 473評論 0 1
  • 找了大半天,沒有合適的配圖。干脆就這樣純文字吧。月月在懷里熟睡讓我一點點找回被需要的感覺。 一直以來,我并不容易被...
    久久桃花閱讀 243評論 0 1
  • 小燕感恩日記(第24天)2018.6.11 感恩,開啟豐盛富足的人生。 感恩今天花出去的錢寶寶為我換來美味...
    小燕十豐盛富足的人生閱讀 154評論 0 2