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

    }
}

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容