1. 程式人生 > >jvm的常量池

jvm的常量池

點選檢視更多:引用·拓展帖

Q1

請談談你對java常量池的理解。

 

 

jvm中的常量池分為三種

    1.類檔案常量池(Class Constant Pool)

    2.執行時常量池(Runtime Constant Pool)

    3.字串常量池(String Constant Pool)

 

在JVM記憶體區域中他們各自所處的位置:

 

下面分別講說這三種常量池各自是什麼和放什麼。

 

1.類檔案常量池

是什麼?

    我們寫的每一個Java類被編譯後,就會形成一份class檔案(每個class檔案都有一個class常量池)。

    class檔案中除了包含類的版本、欄位、方法、介面等描述資訊外,還有一項資訊就是常量池(constant pool table),用於存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。

 

放什麼?

    存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。

    字面量包括:1.文字字串 2.八種基本型別的值 3.被宣告為final的常量等;

    符號引用包括:1.類和方法的全限定名 2.欄位的名稱和描述符 3.方法的名稱和描述符。

 

 

 

 

 

2.執行時常量池

是什麼?

    執行時常量池存在於記憶體中,也就是class常量池被載入到記憶體之後的版本,不同之處是:它的字面量可以動態的新增(String#intern()),符號引用可以被解析為直接引用。

    JVM在執行某個類的時候,必須經過載入、連線、初始化,而連線又包括驗證、準備、解析三個階段。

    而當類載入到記憶體中後,jvm就會將class常量池中的內容存放到執行時常量池中,由此可知,執行時常量池也是每個類都有一個。

    在解析階段,會把符號引用替換為直接引用,解析的過程會去查詢字串常量池,也就是我們上面所說的StringTable,以保證執行時常量池所引用的字串與字串常量池中是一致的。

 

放什麼?

    class檔案元資訊描述,編譯後的程式碼資料,引用型別資料,類檔案常量池

 

 

 

3.字串常量池

是什麼?

    在HotSpot VM裡實現的string pool功能的是一個StringTable類,它是一個雜湊表,預設值大小長度是1009。

    這個StringTable在每個HotSpot VM的例項只有一份,被所有的類共享。字串常量由一個一個字元組成,放在了StringTable上。

 

放什麼?

    在JDK6.0及之前版本中,String Pool裡放的都是字串常量;

    在JDK7.0中,由於String#intern()發生了改變,因此String Pool中也可以存放放於堆內的字串物件的引用。

 

 

 

程式碼|程式|技術貼

 

請留下你指尖的溫度

讓太陽擁抱你

記得這是一個有內容的公眾號