天天看點

JVM的記憶體區域劃分

上幾張圖

JVM的記憶體區域劃分
JVM的記憶體區域劃分
JVM的記憶體區域劃分

常量池(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>

下一篇: java回調函數