06.22 關於java的常量池

什麼是常量

用final修飾的成員變量表示常量,值一旦給定就無法改變!

final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。

Java中的常量池,實際上分為兩種形態:靜態常量池和運行時常量池。

關於java的常量池

1)所謂靜態常量池,即*.class文件中的常量池,class文件中的常量池不僅僅包含字符串(數字)字面量,還包含類、方法的信息,佔用class文件絕大部分空間。

2) 而運行時常量池,則是jvm虛擬機在完成類裝載操作後,將class文件中的常量池載入到內存中,並保存在方法區中,我們常說的常量池,就是指方法區中的運行時常量池。

常量池探秘

每個 java 文件編譯為 class 文件後,都將產生當前類獨有的常量池,我們稱之為靜態常量池。class 文件中的常量池包含兩部分:字面值(literal)和符號引用(Symbolic Reference)。其中字面值可以理解為 java 中定義的字符串常量、final 常量等;符號引用指的是一些字符串,這些字符串表示當前類引用的外部類、方法、變量等的引用地址的抽象表示形式,在類被jvm裝載並第一次使用這些符號引用時,這些符號引用將會解析為直接引用。符號常量包含:

類和接口的全限定名

字段的名稱和描述符

方法的名稱和描述符

jvm在進行類裝載時,將class文件中常量池部分的常量加載到方法區中,此時方法區中的保存常量的邏輯區域稱之為運行時常量區。

關於java的常量池

常量池中存放了各種類型的常量,他們都有自己的類型,並且都有自己的存儲規範,本文只關注字符串常量,字符串常量以01開頭(1個字節),接著用2個字節記錄字符串長度,然後就是字符串實際內容。本例中為:01 00 02 68 69。

接下來再說說運行時常量池,由於運行時常量池在方法區中,我們可以通過jvm參數:-XX:PermSize、-XX:MaxPermSize來設置方法區大小,從而間接限制常量池大小。

程序立刻會拋出:Exception in thread "main" java.lang.outOfMemoryError: PermGen space異常。PermGen space正是方法區,足以說明常量池在方法區中。

關於java的常量池

尚學堂12大精英團隊+各類實戰項目,真正實現1+1>10的目標效果。幫助學員迅速成長,持久騰飛,成就學員“高富帥”人生;幫助企業技術和團隊成長,成就百年中華名企;助力中國持續成為世界強國而貢獻力量。尚學堂12大精英團隊,覆蓋IT行業十大領域,實戰團隊240人,服務學員累計超過10萬人,就業合作企業數量500+。


分享到:


相關文章: