java 變量、對象、方法存儲位置

一個完整的Java程序運行過程會涉及以下內存區域:


一、寄存器

     JVM內部虛擬寄存器,存取速度非常快,程序不可控制


二、java棧

 保存方法內的局部變量的值,包括:

1、用來保存基本數據類型的值;

2、保存類的實例,即堆區對象的引用(指針)。也可以用來保存加載方法時的幀。


三、堆

        用來存放動態產生的數據,Java中的堆是用來存儲對象本身的以及數組(當然,數組引用是存放在Java棧中的)

        比如new出來的對象。注意創建出來的對象只包含屬於各自的成員變量,並不包括成員方法。因爲同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法複製一次。

 

四、本地方法棧

        本地方法棧與Java棧的作用和原理非常相似。區別只不過是Java棧是爲執行Java方法服務的,而本地方法棧則是爲執行本地方法(Native Method)服務的。在JVM規範中,並沒有對本地方發展的具體實現方法以及數據結構作強制規定,虛擬機可以自由實現它。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二爲一

 

五、方法區

      1、方法區基本概念

     方法區系統分配的一個內存邏輯區域,是一塊所有線程共享的內存區域,用來存儲類信息(類型信息可以理解爲類的描述信息(類的全限定名,訪問修飾符,字段,方法等) )、常量和靜態變量

      2、方法區特點

       方法區的大小決定了系統可以包含多少個類,如果系統類太多,方法區內存不夠會導致方法區溢出,虛擬機同樣會拋出內存溢出信息。方法區特點:

       1)方法區是線程安全的,由於所有的線程都共享方法區,所以方法區裏的數據訪問必須被設計成線程安全的。例如,假如同時有兩個線程都企圖訪問方法區中的同一個類,而這個類還沒有被裝入jvm,那麼只允許一個線程去裝在它,而其他線程必須等待。

       2)方法去的大小不必是固定的,jvm可根據應用需要動態調整,同時,方法區也不一定是連續的,方法區可以在一個堆(甚至是jvm自己的堆)中自由分配。

       3)方法區也可被垃圾收集,當某個類不在被使用時,jvm將卸載這個類,進行垃圾收集
 

      3、常量池

           常量池即文件常量池,主要用來保存字面量和符號引用

    

      1)JVM爲每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用。池中的數據和數組一樣通過索引訪問。

      2)java中的常量池技術,是爲了方便快捷地創建某些對象而出現的,當需要一個對象時,就可以從池中取一個出來(如果池中沒有則創建一個),則在需要重複創建相等變量時節省了很多時間。常量池其實也就是一塊內存空間,不同於使用new關鍵字創建的對象所在的堆空間。
  java中的基本類型有:byte、short、char、int、long、boolean。其對應的包裝類分別是:Byte、Short、Character、Integer、Long、Boolean。上邊提到的這些包裝類都實現了常量池技術,而兩種浮點數類型的包裝類則沒有實現。另外,String類型也實現了常量池技術。

 

注意:


     對於局部變量,如果是基本類型,會把值直接存儲在;  

     如果是引用類型,比如String s = new String("william");會把其對象存儲在,而把這個對象的引用(指針)存儲在


    例如:
           String s1 = new String(“william”);
           String s2 = s1;
           s1和s2同爲這個字符串對象的實例,但是對象只有一個,存儲在堆,而這兩個引用存儲在棧中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章