JVM运行时数据区经常在Java面试被问到,下面我重点详解5大JVM运行时数据区@mikechen
Java堆
Java堆是JVM运行时数据区很重要的内容,可以分为新生代和老年代两部分。
如下图所示:
新生代是用于存放新创建的对象实例和数组的区域,通常使用了复制算法来进行垃圾回收。
老年代是用于存放较长时间存活的对象实例和数组的区域,通常使用了标记清除或标记整理算法来进行垃圾回收。
Java堆的大小也是在运行时确定的,它的大小同样受到系统限制。
如果堆的空间不足以为新的对象实例和数组分配内存,则会抛出OutOfMemoryError异常。
方法区
Java方法区,全称Java Method Area,是JVM运行时数据区非常重要的组成部分。
Java方法区主要用于存储已被加载的类信息、常量、静态变量、编译器编译后的代码等数据。
如下图所示:
Java方法区中存储着各个类的元数据信息、静态变量、即时编译器编译之后的代码。
例如:Spring IOC、或者Spring AOP创建的bean,或者使用Cglib动态代理反射的形式生成的Class信息,存储在方法区中。
在Java程序中类的信息是被加载到方法区中的,当Java虚拟机加载一个类时,它会把类的信息加载到方法区中。
方法区也可以根据需要动态扩展或缩小,但是一旦被占用,就不会被释放。
Java虚拟机栈
Java虚拟机栈,全称是Java Virtual Machine Stack,是JVM运行时数据区组成之一。
Java虚拟机栈用于存储方法的执行过程中的局部变量表、操作数栈、动态链接、方法出口等信息。
每个Java方法在执行时,都会创建一个栈帧(Stack Frame),用于存储方法的参数、局部变量等信息。
栈帧是一个数据结构,包含了局部变量表、操作数栈、动态链接、方法出口等信息。
如下图所示:
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睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》