1. 程式人生 > >Java虛擬機器的靜態常量池和執行時常量池

Java虛擬機器的靜態常量池和執行時常量池

(靜態)常量池:用於存放編譯器生成的各種字面量和符號引用(符號引用區別於直接引用,後者在class位元組碼檔案被虛擬機器解析之後,符號引用將被替換為直接引用)。

執行時常量池:(靜態)常量池中的內容在類載入(這裡的類載入指class位元組碼檔案經過載入連線初始化的過程)後存放入方法區的執行時常量池中。相對於靜態常量池,執行時常量池具有動態性,在程式執行的時候可能將新的常量放入執行時常量池中,比如使用String類的intern方法。

對靜態常量池直觀的理解,它是編譯器編譯java程式碼之後所產生的常量,這裡的常量跟編寫程式碼的常量不同,指的是類、介面、方法和欄位的描述資訊,比如類的名稱和其基類。“靜態”,是因為它們只是一個class的描述資訊而已,還沒有具備被執行的能力。在該class檔案被JVM裝載完成之後,靜態常量池中的內容將被解析,並放到執行時常量池中。動態常量池和靜態常量池可以類比程式和程序的關係。

執行時常量池包含:

  • 類、介面、方法和類欄位的表述資訊
  • 字串常量池
  • 被final所修飾的類變數
  • 自動包裝類Byte,Short,Integer,Long,Character在-128到127之間值。

方法區:用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯之後的程式碼等資料。

按照這樣的理解,因為靜態常量池中的內容只是編譯之後的產物,所以其不儲存在方法區中。

這便是(靜態)常量池和動態常量池的區別