Java 內存分區

Java 內存分區主要分5個方面

1.程序計數器  又叫程序寄存器 線程私有 

JVM支持多個線程同時運行,當每一個新線程被創建時,它都將得到它自己的PC寄存器(程序計數器)。如果線程正在執行的是一個Java方法(非native),那麼PC寄存器的值將總是指向下一條將被執行的指令,如果方法是 native的,程序計數器寄存器的值不會被定義。 JVM的程序計數器寄存器的寬度足夠保證可以持有一個返回地址或者native的指針。

 

2.Java棧   線程私有  

JVM爲每個新創建的線程都分配一個棧。也就是說,對於一個Java程序來說,它的運行就是通過對棧的操作來完成的。棧以幀爲單位保存線程的狀態。JVM對棧只進行兩種操作:以幀爲單位的壓棧和出棧操作。我們知道,某個線程正在執行的方法稱爲此線程的當前方法。我們可能不知道,當前方法使用的幀稱爲當前幀。當線程激活一個Java方法,JVM就會在線程的 Java堆棧裏新壓入一個幀,這個幀自然成爲了當前幀。在此方法執行期間,這個幀將用來保存參數、局部變量、中間計算過程和其他數據。從Java的這種分配機制來看,堆棧又可以這樣理解;局部變量和對象引用都是放在棧區,代碼運行完就會被自動回收。

 

3.Java堆  線程共享

成員變量 是屬於對象所有的 所以是放在堆區  對象本身也是放在堆區  這是是JavaGC的核心 不會自動回收 

jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身,對象在這裏被分配內存.

 

4. 方法區  線程共享

當虛擬機裝載一個class文件時,它會從這個class文件包含的二進制數據中解析類型信息,然後把這些類型信息(包括類信息、常量、靜態變量等)放到方法區中,該內存區域被所有線程共享。雖然JVM規範把方法區描述爲堆得一個邏輯部分,但是他有一個別名叫Non-heap(非堆),目的應該是與Java堆區分開。主要有string常量 final常量  static修飾的 都是在方法區

 

5.本地方法棧

主要是存放Native的方法。

 

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