上幾張圖
常量池(constant
pool)指的是在編譯期被确定,并被儲存在已編譯的.class檔案中的一些資料。它包括了關于類、方法、接口等中的常量,也包括字元串常量。
string.intern():
存在于.class檔案中的常量池,在運作期被jvm裝載,并且可以擴充。string的intern()方法就是擴充常量池的一個方法;當一個string執行個體str調用intern()方法時,java查找常量池中是否有相同unicode的字元串常量,如果有,則傳回其的引用,如果沒有,則在常量池中增加一個unicode等于str的字元串并傳回它的引用;
基本資料類型是放在棧中還是放在堆中,這取決于基本類型在何處聲明,下面對資料類型在記憶體中的存儲問題來解釋一下:
一:在方法中聲明的變量,即該變量是局部變量,每當程式調用方法時,系統都會為該方法建立一個方法棧,其所在方法中聲明的變量就放在方法棧中,當方法結束系統會釋放方法棧,其對應在該方法中聲明的變量随着棧的銷毀而結束,這就局部變量隻能在方法中有效的原因
在方法中聲明的變量可以是基本類型的變量,也可以是引用類型的變量。
(1)當聲明是基本類型的變量的時,其變量名及值(變量名及值是兩個概念)是放在方法棧中
(2)當聲明的是引用變量時,所聲明的變量(該變量實際上是在方法中存儲的是記憶體位址值)是放在方法的棧中,該變量所指向的對象是放在堆類存中的。
二:在類中聲明的變量是成員變量,也叫全局變量,放在堆中的(因為全局變量不會随着某個方法執行結束而銷毀)。
同樣在類中聲明的變量即可是基本類型的變量 也可是引用類型的變量
(1)當聲明的是基本類型的變量其變量名及其值放在堆記憶體中的
(2)引用類型時,其聲明的變量仍然會存儲一個記憶體位址值,該記憶體位址值指向所引用的對象。引用變量名和對應的對象仍然存儲在相應的堆中
根據上下文來确定引用變量存放在堆還是棧中。
常量池主要用于存放兩大類常量:字面量(literal)和符号引用量(symbolic references),字面量相當于java語言層面常量的概念,如文本字元串,聲明為final的常量值等,符号引用則屬于編譯原理方面的概念,包括了如下三種類型的常量:
類和接口的全限定名
字段名稱和描述符
方法名稱和描述符
字面量可以是任意的數字或字元,直接代表了一個值。
java中八種基本類型的包裝類的大部分都實作了常量池技術,它們是byte、short、integer、long、character、boolean,另外兩種浮點數類型的包裝類(float、double)則沒有實作。另外byte,short,integer,long,character這5種整型的包裝類也隻是在對應值在-128到127時才可使用對象池。
javap 檢視編譯器生成的位元組碼(後面不需要帶class字尾)
javap -verbose test >> file
詳細介紹:
<a href="http://chenzehe.iteye.com/blog/1727062" target="_blank">http://chenzehe.iteye.com/blog/1727062</a>
參考文章:
<a href="http://www.cnblogs.com/dolphin0520/p/3613043.html" target="_blank">http://www.cnblogs.com/dolphin0520/p/3613043.html</a>