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