JAVA虛擬機運行時內存分配
- PC寄存器
- JAVA棧
- JAVA堆
- 方法區
- 運行常量池
- 本地方法棧
PC寄存器
每一條java虛擬機線程都有自己的pc寄存器,任意時刻java虛擬機只會執行一個方法的代碼,若該方法不是native的pc寄存器保存正在執行的字節碼指令地址,如果是native的pc寄存器的值爲undefined(未定義)
JAVA 棧
每一條java虛擬機線程都有自己私有的java虛擬機棧,這個棧與虛擬機線程被同時進行創建,用於存儲局部變量和一些沒有計算好的結果,java虛擬機棧不需要保證內存是連續的。
請求分配內存時超出虛擬機允許的最大容量StackOverflowError
棧在嘗試擴展空間沒有申請到足夠的內存OutOfMemoryError
JAVA 堆
堆提供一個可以供個個線程共享的運行時內存區域(對象,數組分配內存),java虛擬機堆在虛擬機啓動時就被創建了,他存儲自動內存管理系統(垃圾回收器)所管理的各種對象。
堆內存超過內存管理最大容量OutOfMerryError
方法區
方法區提供一個可以供個個線程共享的運行時內存區域,方法區在虛擬機啓動時創建,方法區是堆的邏輯組成部分,但簡單的虛擬機實現在這個區域可以不實現垃圾收集和回收。
運行常量池
運行常量池在方法區中分配。他是每一個類或接口在運行時的表達形式
本地方法棧
java虛擬機實現過程中可能用到傳統的C棧(C Stack)來支持native方法(用其他語言編寫的方法),這個棧就是本地方法棧