线程共享区:方法区、java堆
线程独占区:虚拟机栈、本地方法栈、程序计数器
1. 方法区:存储运行时常量池,已被虚拟机加载的类信息、常量、静态变量,即编译器编译后的代码等数据;
2. java堆:存储对象实例;
3. 虚拟机栈:存放方法运行时所需的数据;
4. 本地方法栈:JVM所调用的native本地方法;
5. 程序计数器:记录当前线程所执行到字节码的行号。
  1. 程序计数器
    程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器;
    执行java方法,记录正在执行的虚拟机字节码指令的地址,执行native方法,值为undefined;
    此区域是唯一java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
  2. 虚拟机栈
    虚拟机栈描述的是java方法执行的动态内存模型;
    栈帧:
    1. 每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成;
    2. 用于存储局部变量表,操作数帧,动态链接,方法出口等;
      局部变量表:
    3. 存放编译期可知的各种基本数据类型,引用类型,returnAddress类型;
    4. 局部变量表的内存空间在编译器完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在运行期间是不会该白女局部变量表的大小。
      说明:
    5. StackOverflowError 栈中栈帧满了还继续调用导致的异常
    6. OutOfMemoryError 栈请求的内存空间大于JVM的内存空间
  3. 本地方法栈(hotspom不区分本地方法栈与虚拟机栈)
    虚拟机栈为虚拟机执行java方法服务;
    本地方法栈为虚拟机执行native本地方法。
  4. java堆(线程共享)
    存放对象实例
    垃圾收集器管理的主要区域
    新生代、老年代、Eden空间
  5. 方法区(线程共享)
    存储虚拟机加载的类信息,常量,静态变量,即编译器编译后的代码等数据;
    1. 类的版本;
    2. 字段;
    3. 方法
    4. 接口
      方法区和老年代
      垃圾回收在方法区的行为
      异常的定义