一步步学Java

JVM内存模型

2017-04-13  本文已影响123人  齐晋

内存模型

五大区域

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

    }
}

参考

上一篇 下一篇

猜你喜欢

热点阅读