什么是 JVM
JVM(Java Virtual Machine) 是一种能够执行Java字节码的虚拟机,它是Java编程语言的核心并且是Java平台的一部分。
JVM的作用
JVM是Java程序运行的核心,它可以将Java源代码编译为字节码并在不同操作系统上执行,保证了Java跨平台的特性。同时,JVM还负责Java程序的内存管理、垃圾回收、线程管理等任务,确保Java程序的稳定和高效运行。
类的加载过程
类的加载过程一般分为加载、验证、准备、解析和初始化五个阶段。
加载
概念
加载指的是将类的字节码文件加载到JVM中,以便能够被JVM执行。
加载过程
类加载过程中通常会经过如下几个步骤:
- 加载字节码文件。
- 内部产生一个Java.lang.Class对象,表示该类。
- 将Class对象放入方法区中,并赋唯一编号。
验证
概念
验证阶段是确保被加载的类符合JVM规范的过程,防止有可能破坏JVM的安全和稳定性的操作或数据。
验证过程
验证阶段通常包括以下的几个步骤:
- 文件格式验证:检查字节码文件格式是否符合规范。
- 元数据验证:确保类中的所有元数据符合JVM规范。
- 字节码验证:对字节码进行验证,确保字节码的语法和语义正确。
- 符号引用验证:确保类中的所有符号引用都是合法的,不存在错误和不兼容的引用。
- 强制性验证:对类中的所有操作的合法性进行验证。
准备
概念
准备阶段是为类变量(也称为静态变量)在方法区分配内存,并设置默认的初值。
准备过程
- 为类变量在方法区中分配内存。
- 设置类变量的默认值。
解析
概念
解析阶段是将类中的符号引用解析为直接引用的过程。
解析过程
- 将常量池中的符号引用转换为直接引用。
- 解析符号引用的过程中可能会产生新的类加载,这些类也需要经过加载、验证、准备等过程。
初始化
概念
初始化阶段是类第一次使用时,JVM执行
初始化过程
- 初始化阶段由JVM负责保证每个类的类构造器
方法在多线程下被正确的初始化,且此方法只被执行唯一的一次。 - 在初始化阶段中,JVM会根据
方法中的类变量赋值动作,生成并加入 clinit 方法中,不同类变量的赋值动作按源代码中定义的先后顺序执行。
类的加载器
概念
类加载器是负责将类的字节码文件加载到JVM中的模块,它可以动态的加载类,实现动态扩展和替换。
分类
常见的类加载器分为四类:启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器。
启动类加载器
启动类加载器负责加载JVM运行时需要的基本操作库和Java系统类,它是JVM内置的加载器,通常使用C++编写,无法用Java程序实现或者替换。
扩展类加载器
扩展类加载器负责加载Java扩展库(JAVA_HOME/lib/ext目录下的jar包),它从系统属性“java.ext.dirs”所指定的目录中加载class文件。
应用程序类加载器
应用程序类加载器负责加载应用程序的类文件。它从CLASSPATH环境变量所指定的目录或jar文件中查找和加载类文件。
自定义类加载器
自定义类加载器可以通过编写自己的Java代码实现。自定义类加载器通常应用在环境隔离、热部署等场景。
类的卸载
概念
类的卸载指的是将已经加载到内存中的类的信息从内存中清除。
触发条件
类的卸载条件包括:
- 类的所有实例都已被GC回收
- 加载该类的类加载器已经被回收
- 该类的Class对象没有被引用
卸载过程
类卸载过程中,JVM会将该类和其内部对象销毁,并且释放对应的内存空间。
扩展点:JVM参数
JVM参数是控制JVM各种运行模式的参数。常用的JVM参数包括-Xms(初始堆大小)、-Xmx(最大堆大小)、-Xmn (年轻代大小)、-XX:+UseG1GC(启用G1垃圾回收器)等。
总结
JVM是Java程序运行的核心,它可以将Java源代码编译为字节码并在不同操作系统上执行,并且负责Java程序的内存管理、垃圾回收、线程管理等任务,确保Java程序的稳定和高效运行。类的加载过程包括加载、验证、准备、解析和初始化五个阶段,类的加载器负责将类的字节码文件加载到JVM中,实现类的动态扩展和替换。JVM参数可以通过控制JVM的各种运行模式来优化Java程序的性能和稳定性。
文章评论