浅谈JVM之运行时数据区
最近在准备春招的面试和笔试,今天四个笔试。可太得劲了。
也会整理一下每周的面经噢,有需要的码友可以关注一下。
JVM的定义:
Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程。
JVM的组成:
JVM主要由四部分组成:
- 类加载器子系统:用于加载字节码(.class)文件。
- 运行时数据区(内存区):将内存划分为若干个区,以模拟实际机器上功能。
- 执行引擎:负责执行字节码文件中的指令。
- 本地方法接口:调用c或c++实现本地方法。
JVM的内存模型(运行时数据区):
- 线程共享区:方法区、堆区。
- 线程私有区:程序计数器、虚拟机栈、本地方法栈。
先谈一谈方法区把:
先了解方法区、永久代、元空间者三者的关系:
-------方法区是规范,永久代和元空间是具体实现。或者说,方法区是Java中的接口,永久代、元空间是Java中接口的实现类。
作用:
- JDK8之前叫永久代。永久代在堆区,用于存放类的元信息,及InstanceKlass类的实例(这个之后可以细说)。
- JDK8及以后叫元空间,元空间在OS内存上,用于存放类的元信息。
堆区(重点):
内存模型中最核心的区域。
即是JVM调优,重点关注的地方,也是垃圾回收(GC)的主要区域。
作用:主要是用来存储对象的。
虚拟机栈、本地方法栈、程序计数器:
虚拟机栈:是用来存储局部变量和引用变量的。当方法被执行时,虚拟机都会同步创建一个栈帧用来执行该方法,方法的生命周期与改栈帧一样。
—栈帧又包括:
- 局部变量表:局部变量表是用来存放方法参数和方法内部定义的局部变量,在Java程序被编译为字节码文件时,就确定了该方法局部变量表所需要的最大容量。
- 操作数栈:操作数栈可以理解为用于计算的临时数据存储区。
- 动态链接:每个栈帧都在常量池中保存了大量的符号引用。当前方法中如果需要调用其他方法的时候, 能够从运行时常量池中找到对应的符号引用, 然后将符号引用转换为直接引用,这样就能直接调用对应方法, 这就是动态链接。相对的,静态链接就是在类解析的过程中就会将符号引用转换为直接引用。
- 返回地址:在方法完成之后,都需要返回最初方法被调用时的位置,程序才能正常运行,所以会在栈帧中存储方法返回的地址,用来帮助程序返回。
本地方法栈:JAVA通过JNI调用C、C++动态链接库需要的栈,随着socket的发展,JNI技术已经用得非常非常少。
程序计数器:是当前线程所执行字节码的行号指示器。
简单来说就是字节码指令前面的index.