- 运行时数据区分布示意图
(1)线程共享数据区(线程共有):方法区、堆
(2)线程隔离数据区(线程私有):虚拟机栈、本地方法栈、程序计数器
1、方法区
(1)方法区介绍
各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
(2)方法区作用
内存中存放类信息、静态变量等数据,属于线程共享的一块区域。
(3)方法区特点
内存回收目标主要是针对常量池的回收和对类型的卸载。
2、Java堆(Heap)
(1)Java堆介绍
Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块Java堆是被所有线程所共享的一块内存区域。
(2)Java堆主要作用
JVM内存区域中用来存放对象实例的区域。几乎所有的对象实例都在这里分配。
(3)特点
Java堆是垃圾回收器管理主要区域,很多时候被称为GC堆。
3、虚拟机栈(线程私有栈)
(1)虚拟机栈介绍
每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。
(2)栈帧介绍
每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
- 注意事项:**并行每个线程下的栈都是私有的,因此每个线程都有自己各自的栈,并且每个栈里面都有很多栈帧,**栈帧的大小主要由局部变量表和操作数栈决定的;
①局部变量表:用于存储方法参数和定义在方法体内的局部变量,类基本数据类型、对象引用(reference),以及 returnAddress 类型。
- 注意事项:当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
②操作数栈:主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
③动态链接:将运行时常量池中的符号引用转换为调用方法的直接引用
- 注意事项:在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 class 文件的运行时常量池里。
- 运行时常量池作用:因为在不同的方法,都可能调用常量或者方法,所以只需要存储一份即可,节省了空间常量池的作用,就是为了提供一些符号和常量,便于指令的识别。
④方法返回地址:存放调用该方法的 PC 寄存器的值。
- 注意事项:方法正常退出时,调用者的 PC 计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址
(3)特点
局部变量表存放编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)以及对象引用(reference类型)
- 注意事项:如果线程请求栈深度大于虚拟机所允许的深度。将抛出StackOverflowError异常
(4)范例
public class Stack {
public static void main(String[] args) {
c();
System.out.println("调用main方法");
}
public static void a(){
System.out.println("调用方法a");
}
public static void b(){
a();
System.out.println("调用方法b");
}
public static void c(){
b();
System.out.println("调用方法c");
}
}
- 运行结果
4、本地方法栈
(1)本地方法栈介绍
用于作用域本地方法执行的一块Java内存区域
(2)主要作用
与Java虚拟机栈相同,每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。
- 注意事项:本地方法栈执行的是Native方法服务,而虚拟机栈执行的是java方法
(3)特点
在 HotSpot JVM 中,直接将本地方法栈和虚拟机栈合二为一。
5、程序计数器(PC寄存器)
(1)程序计数器介绍
一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指令器,装载是当前线程正在执行的字节码才会执行程序;
字节码:即.class文件内容
- 运行示意图如下
(2)程序计数器主要作用
为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互相不影响,独立存储,我们称这类内存区域为"线程私有"的内存
- 简单理解程序计数器主要作用就是保存线程在CPU时间切片运行后的状态,CPU时间切片在切回这个线程后,读取计数器的保存状态继续往下执行。
(3)特点
内存区域中唯一一个没有规定任何OutOfMemoryRError情况的区域。
- 注意事项:程序计数器是由JVM自己维护的,所以没有OOM的情况。