JVM运行时数据区详解(5大运行时数据区)

JVM运行时数据区详解(5大运行时数据区)-mikechen

JVM运行时数据区经常在Java面试被问到,下面我重点详解5大JVM运行时数据区@mikechen

JVM运行时数据区详解(5大运行时数据区)-mikechen

Java堆

Java堆是JVM运行时数据区很重要的内容,可以分为新生代和老年代两部分。

如下图所示:

JVM运行时数据区详解(5大运行时数据区)-mikechen

新生代是用于存放新创建的对象实例和数组的区域,通常使用了复制算法来进行垃圾回收。

老年代是用于存放较长时间存活的对象实例和数组的区域,通常使用了标记清除或标记整理算法来进行垃圾回收。

Java堆的大小也是在运行时确定的,它的大小同样受到系统限制。

如果堆的空间不足以为新的对象实例和数组分配内存,则会抛出OutOfMemoryError异常。

 

方法区

Java方法区,全称Java Method Area,是JVM运行时数据区非常重要的组成部分。

Java方法区主要用于存储已被加载的类信息、常量、静态变量、编译器编译后的代码等数据。

如下图所示:

JVM运行时数据区详解(5大运行时数据区)-mikechen
Java方法区中存储着各个类的元数据信息、静态变量、即时编译器编译之后的代码。

例如:Spring IOC、或者Spring AOP创建的bean,或者使用Cglib动态代理反射的形式生成的Class信息,存储在方法区中。

在Java程序中类的信息是被加载到方法区中的,当Java虚拟机加载一个类时,它会把类的信息加载到方法区中。

方法区也可以根据需要动态扩展或缩小,但是一旦被占用,就不会被释放。

 

Java虚拟机栈

Java虚拟机栈,全称是Java Virtual Machine Stack,是JVM运行时数据区组成之一。

Java虚拟机栈用于存储方法的执行过程中的局部变量表、操作数栈、动态链接、方法出口等信息。

每个Java方法在执行时,都会创建一个栈帧(Stack Frame),用于存储方法的参数、局部变量等信息。

栈帧是一个数据结构,包含了局部变量表、操作数栈、动态链接、方法出口等信息。

如下图所示:

JVM运行时数据区详解(5大运行时数据区)-mikechen

Java虚拟机栈是由若干个栈帧组成的,每当一个方法被调用时,就会在Java虚拟机栈中创建一个新的栈帧。

当方法执行完毕时,该栈帧会被弹出,同时Java虚拟机栈的栈顶指针也会随之改变。

 

本地方法栈

本地方法栈,全称Native Method Stack,是JVM运行时数据区组成之一。

本地方法栈用于:存储Java程序中所调用的本地方法(Native Method)的相关信息。

本地方法是一种用C、C++等非Java语言编写的方法,它们使用Java Native Interface(JNI)技术与Java代码进行交互。

本地方法栈与Java虚拟机栈非常相似,不同之处在于本地方法栈为本地方法服务,而Java虚拟机栈为Java方法服务。

本地方法栈也由若干个栈帧组成,每当一个本地方法被调用时,就会在本地方法栈中创建一个新的栈帧。

当本地方法执行完毕时,该栈帧会被弹出,同时本地方法栈的栈顶指针也会随之改变。

 

程序计数器

程序计数器(Program Counter,PC),也称指令计数器(Instruction Counter),是JVM运行时数据区组成之一。

在线程执行Java方法时,程序计数器记录的是正在执行的字节码指令的地址,包括了:基本的代码顺序、循环、跳转、异常处理等信息。

通过程序计数器,可以准确地获取正在执行的线程,以及线程执行到哪一行代码,方便异常处理和线程调试等。

以上就是JVM运行时数据区的详解,更多JVM内容,请查看:JVM(Java虚拟机)从0到1全部合集

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法