前言
本节内容是关于java虚拟机JVM组成部分的介绍,通过其组成架构图了解JVM的主要组成部分。
正文
ClassFile:字节码文件
- javac:javac前端编译器将源代码编译成符合jvm规范的.class文件,即字节码文件
- class文件的结构组成:魔术、Class文件版本、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合
- javap:解析字节码,将字节码文件解析为可读的机器码
类加载器子系统(Class Loader):负责将编译后的Java字节码加载到内存中,并在运行时创建对应的类和对象。类加载器根据类的名称、包名等信息来查找并加载类。
- 类的加载过程
①Loading(装载)阶段:将java类的字节码文件加载到机器内存中并在内存中构建出java类的模版对象(类数据结构),存储在方法区(1.8之前永久代,1.8之后元空间),实例对象在堆中
②Linking(链接)阶段
-验证:格式检查、语义检查、字节码验证、符号引用验证。
-准备:为类的静态变量分配内存,并将其初始化为默认值;同时final修饰的static静态变量会在此直接赋值
-解析:将类、接口、字段和方法的符号引用转为直接引用
③Initialization(初始化)阶段
- clinit方法为类的静态变量赋正确的初始值(显示赋值给static修饰的变量或者在静态代码块中赋值)
④类是使用阶段
⑤类的卸载阶段
- 类加载器
①引导类加载器Bootstrap ClassLoader:加载JAVA_HOME/jre/lib/rt.jar,没有父加载器,没有继承Class Loader,是系统加载器,C语言实现
②扩展类加载器Extension ClassLoader:加载JAVA_HOME/jre/lib/ext子目录下加载类库,父加载器是Bootstrap ClassLoader
③系统类加载器App ClassLoader:父加载器是扩展类加载器Extension ClassLoader
运行时数据区(Runtime Data Area):也称为Java堆,它是JVM用来存储对象实例和数组的地方。Java堆在JVM启动时就被创建,用于存储动态分配的内存。
方法区(Method Area):用于存储类的结构信息,如类的字段、方法信息、静态变量、常量池等。方法区在JVM启动时被创建,它是各个线程共享的内存区域。
堆(Heap):用于存储对象实例和数组对象。所有通过关键字
new
创建的对象都会在堆上分配内存。堆是Java虚拟机管理的最大的一块内存区域,它在JVM启动时被创建,并被所有线程共享。程序计数器(Program Counter Register):用于存储当前线程正在执行的Java虚拟机字节码指令的地址。每个线程都有自己独立的程序计数器,用于记录下一条即将执行的指令地址。
本地方法栈(Native Method Stack):类似于虚拟机栈,但是用于执行本地(Native)方法的栈空间。本地方法栈也是线程私有的,存储的是调用本地方法时的状态信息。
虚拟机栈(VM Stack):每个线程在执行Java方法时,都会创建一个对应的栈帧(Stack Frame),用于存储方法的局部变量、操作数栈、动态链接、方法出口等信息。虚拟机栈的大小可以在启动时通过参数进行调整。
执行引擎(Execution Engine):负责执行Java字节码指令。执行引擎有两种主要实现方式:解释器和即时编译器(JIT)。解释器逐条解释字节码指令并执行,而即时编译器将字节码转换成本地机器代码,以提高执行效率。
解释器:逐行解释执行。
即时编译器(Just-In-Time Compiler,JIT):将经过多次解释执行的热点代码(HotSpot)编译成本地机器代码,以提高执行速度。JIT编译器会根据运行时的性能数据进行优化,从而提升程序的执行效率。
JNI(Java Native Interface):允许Java代码与本地代码(如C/C++)进行交互。JNI提供了一组API,使得Java代码可以调用本地方法,以便获得更高的灵活性和性能。
NML(Native Method Libraries):本地方法库,支持本地的一些类库。
结语
本节内容到这里就结束了,我们下期见。。。。。。