JVM内存模型

内存模型

五大区域

  1. 程序计数器(PC)
  2. 虚拟机栈
  3. 本地方法栈
  4. 方法区(包含常量池)
JVM内存模型_第1张图片

JVM内存模型_第2张图片

JVM内存模型_第3张图片

详细介绍

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();
        }

    }
}

参考

  • Jvm内存模型
  • 最简单例子图解JVM内存分配和回收
  • JVM内存组成及分配

你可能感兴趣的:(JVM内存模型)