你對常量池夠了解嗎 一、class 常量池 二、字符串常量池 三、運行時常量池

在 java 中,常量池分爲以下三種:

  • class 常量池
  • 字符串常量池
  • 運行時常量池

一、class 常量池

1. 是什麼?

是class文件中的資源倉庫。我們的 class 文件,用十六進制編輯器( notepad++ 安裝 Hex-editor )打開,可以發現它第二行的內容是這樣的:

cafe babe 0000 0033 0010 0a00 0300 0d07……

每個 class 文件用十六進制編輯器打開,開頭都是 cafe babe,這個叫魔數。那麼剩下的是什麼意思呢?

cafe babe       0000      0033       0010             0a00 0300 0d07……
   魔數       次版本號   主版本號   常量池計數器          常量池數據區……

看到沒,這裏就有常量池。啊這,我說它是就是,我說就一定對嗎?我們可以使用如下命令,查看字節碼文件:

javap -verbose Test.class

執行之後會看到:

看吧,我是不會騙你的!

2. 位置:

既然說了是 class 常量池,那它就是在 class 文件中。

3. 保存的數據:

class 常量池保存的東西主要有以下兩類:

  • 字面量:簡單地理解爲等號右邊的值,比如類中定義了int a = 1; String str = "hello",那麼 1 和 hello 都是字面量。

  • 符號引用:類和接口的全限定名、字段的名稱和描述符、方法的名稱和描述符,這些就叫符號引用。

二、字符串常量池

1. 是什麼?

顧名思義,就是用來保存字符串的常量池。爲了提高執行效率、節省內存開銷,從而整了個字符串常量池來緩存字符串數據。關於 String 的詳細介紹,請參考我另一篇文章 String類相關面試題很難?不要方,問題不大

2. 位置:

  • jdk 1.7 之前,字符串常量池在方法區

  • jdk 1.7 及之後,字符串常量池在堆內存中

三、運行時常量池

1. 是什麼?

當 class 文件通過 ClassLoader 加載到 JVM 內存時,會把 class 常量池 中的內容加載到方法區的一塊內存中,這塊內存就叫運行時常量池。

2. 位置:

運行時常量池在方法區中,jdk 1.7 極其之前方法區的實現叫永久代,jdk 1.8 開始叫元空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章