2.2 运行时数据区域
2.2.1 程序计数器
Program Counter Register: 可以看做是当前线程所执行的字节码的行号指示器,是线程私有的
java虚拟机的概念模型:表示所有虚拟机的统一外观,但各款具体的Java虚拟机并不一定要完全照着概念模型的定义来进行设计
2.2.2 Java虚拟机栈
- 生命周期与线程相同
- 描述的是Java方法执行的线程内存模型:每个方法执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息
局部变量表存放了编译器可知的各种Java虚拟机基本数据类型、对象引用和returnAddress类型
这些数据类型在局部变量表中的存储空间以局部变量槽(slot)来表示
对内存区域有两类异常状况:
- StackOverflowError: 如果线程请求的栈深度大于虚拟机所允许的深度
- OutOfMemoryError:当栈扩展时无法申请到足够的内存
2.2.3 本地方法栈
虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的本地方法服务
本地方法栈也有上述的两种异常
2.2.4 Java堆
- 虚拟机所管理的内存中最大的一块
- 是被所有线程共享的一块内存区域,在虚拟机启动时创建
- 唯一目的是存放对象实例
- 由于java堆也是垃圾收集器管理的内存区域,因此也被称作“GC堆”(Garbage Collected)
从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)
2.2.5 方法区
各个线程共享的内存区域
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
2.2.6 运行时常量池
是方法区的一部分
-
2.2.7 直接内存
不是运行时数据区域的一部分,所以不会受到java堆大小的限制
- 会受到本机总内存大小以及处理器寻址空间的限制
2.3 HotSpot虚拟机对象探秘