简介
JVM的运行时数据区是指程序运行时会使用的数据区域,其由6个部分组成(准确来说应该是5个,方法区中包含了运行时常量区,但是JVM规范单独介绍了运行时常量区):
1. pc寄存器:每一个JVM线程分配一个独享的pc寄存器。在任何时刻,一个JVM线程只会执行一个方法,当前执行的方法称为该线程的当前方法。非native的当前方法,pc寄存器存储正在执行的字节码指令地址。native的当前方法,寄存器存储undefined。
2. Java虚拟机栈:每一个JVM线程都会有私有的Java虚拟机栈,该栈与线程同时创建,用于存储栈帧。Java虚拟机栈一般用于存储局部变量与一些尚未算好的结果。
3. Java堆:Java堆是各个JVM线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。Java堆在虚拟机启动的时候就被创建,其存储的对象由自动内存管理系统(即垃圾收集器)管理。
4. 方法区:方法区也是可供各个线程共享的运行时操作内存区域。其包含了运行时常量池,也存储了字段和方法数据、构造函数和普通方法的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。
5. 运行时常量池:运行时常量池是class文件中每一个类或接口的常量池表的运行时表示形式,其包含了若干种不同的常量。每一个运行时常量池都是在方法区中分配的(即运行时常量池是方法区的一部分)。
6. 本地方法栈:用于支持native方法的执行的栈就是本地方法栈。
对比分析表
名称 | 创建时间 | 是否线程独享 | 可能出现的Error |
---|---|---|---|
pc寄存器 | 伴随JVM线程创建时创建 | 是 | 无 |
Java虚拟机栈 | 伴随JVM线程创建时创建 | 是 | StackOverflowError和OutOfMemoryError |
Java堆 | 虚拟机启动的时候创建 | 否 | OutOfMemoryError |
方法区 | 虚拟机启动的时候创建 | 否 | OutOfMemoryError |
运行时常量区 | 加载类和接口到虚拟机后,就创建对应的运行时常量池 | 否 | OutOfMemoryError |
本地方法栈 | 线程创建的时候按线程分配 | 是 | StackOverflowError和OutOfMemoryError |