堆、棧、方法區概念區別

堆、棧、方法區概念區別

 

1,  Java 堆

    堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變  量,這個變量的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以後就可以在程序中使用棧內存中的引用變量來訪問  堆中的數組或者對象,引用變量相當於爲數組或者對象起的一個別名,或者代號

  根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最爲常見的就是將整個Java堆分爲

  新生代和老年代。其中新聲帶存放新生的對象或者年齡不大的對象,老年代則存放老年對象。

  新生代分爲den區、s0區、s1區,s0s1也被稱爲fromto區域,他們是兩塊大小相等並且可以互相角色的空間。

  絕大多數情況下,對象首先分配在eden區,在新生代回收後,如果對象還存活,則進入s0s1區,之後每經過一次

  新生代回收,如果對象存活則它的年齡就加1,對象達到一定的年齡後,則進入老年代。

 

 

2,Java棧

    

    Java棧是一塊線程私有的空間,一個棧,一般由三部分組成:局部變量表、操作數據棧和幀數據區

      局部變量表:用於報錯函數的參數及局部變量

    操作數棧:主要保存計算過程的中間結果,同時作爲計算過程中的變量臨時的存儲空間。

    幀數據區:除了局部變量表和操作數據棧以外,棧還需要一些數據來支持常量池的解析,這裏幀數據區保存着

    訪問常量池的指針,方便計程序訪問常量池,另外當函數返回或出現異常時賣虛擬機子必須有一個異常處理表,方便發送異常

    的時候找到異常的代碼,因此異常處理表也是幀數據區的一部分。

    

3,Java方法區

    Java方法區和堆一樣,方法區是一塊所有線程共享的內存區域,他保存系統的類信息。

    比如類的字段、方法、常量池等。方法區的大小決定系統可以保存多少個類。如果系統

    定義太多的類,導致方法區溢出。虛擬機同樣會拋出內存溢出的錯誤。方法區可以理解

    爲永久區。

 

 

 4,本地方法棧

    主要調用c語言 jni

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