JVM內存模型

內存模型

五大區域

  1. 程序計數器(PC)
  2. 虛擬機棧
  3. 本地方法棧
  4. 方法區(包含常量池)


詳細介紹

1. 程序計數器

程序計數器 ,簡稱PC(Program Counter Register)

內容

  • 存儲要運行的字節碼地址

特點

  • 線程私有,每個線程都有一個PC
  • 當執行一個方法時,PC中存儲的是要執行的字節碼地址
  • 當執行一個本地方法時,PC為空

異常

  • 唯一一個不會發送OutOfMemory的區域

2. 虛擬機棧

Java Virtual Machine Stacks

內容

  • 局部變量
  • 函數調用返回地址

特點

  • 線程私有
  • 聲明周期與線程相同

異常

  • StackOverflow: 棧深度過大
  • OutOfMemory: 內存溢出

3. 本地方法棧

Native Method Stack
Native Method是指由非Java編寫的代碼

內容

  • Native方法的變量

特點

  • 有些虛擬機將本地方法棧與虛擬機棧合二為一(如HotSpot)

異常

  • StackOverflow: 棧深度過大
  • OutOfMemory: 內存溢出

4. 方法區

Method Area

內容

  • 類信息
  • 常量、靜態變量
  • 編譯后的代碼

特點

異常

  • OutOfMemory: 內存溢出

5. 堆

Heap

內容

  • new出來的對象

特點

  • JVM管理的最大一塊內存,也是GC主戰場
    分為新生代和老年代

異常

  • OutOfMemory: 內存溢出
    ·

OOM (OutOfMemory)

Stack Overflow

一個Stack Overflow例子

public class Main {

    private int size = 1;

    public void stackLeak(){
        size++;
        stackLeak();
    }
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Main gg = new Main();
        try{
            gg.stackLeak();
        }catch(Throwable e){
            System.out.println(gg.size);
            throw e;
            //e.printStackTrace();
        }

    }
}

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容