Java-JVM是什么JVM的类加载机制
一.JVM是什么
1.jvm是java虚拟机,是java程序运行的基础环境
2.jvm运行的是java源代码经过编译后的class文件,这些class文件经过jvm负责解释或即时编译为对应平台的机器码并执行
3.class文件也可以通过其他【jvm languages】经过编译后得到,例如scala、kotlin、groovy等
二.JVM的类加载机制
JVM的类加载机制分为:加载,链接,初始化三个阶段
链接又分为验证,准备,解析三个阶段
1.加载
将二进制流读入内存,生成一个class对象
加载机制-双亲委派机制
即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器.
父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载.
(图源黑马)
优点:
1. 避免类的重复加载
2. 避免Java的核心API被篡改如何打破双亲委派机制:
1. 自定义类加载器时,重写 `ClassLoader` 的 `loadClass` 方法,改变默认的 “先委派父加载器” 逻辑。比如,可强制让自定义加载器优先加载特定路径、特定前缀的类,而非严格遵循双亲委派的委派顺序。
2. Java 标准库中(如 JDBC、JAXP ),核心类由启动类加载器加载,但实现类(如 MySQL JDBC 驱动)在应用类路径。为让核心类(父加载器加载)能加载应用类路径的实现类,`ServiceLoader` 会**反向委派**:父加载器(如 `Bootstrap ClassLoader` )加载的类,委派给应用类加载器(`AppClassLoader` )加载其实现类,打破 “父加载器无法请求子加载器” 的双亲委派限制。
3. OSGi 是模块化框架,每个模块(Bundle)有独立类加载器。加载类时,**按需委派**:可配置加载策略(如 “先自己加载,再委派父加载器”,或 “特定包委派给指定加载器” ),完全突破双亲委派的固定顺序,实现类加载的 “细粒度控制”。
2.链接
2.1验证
验证加载进来的二进制流是否符合一定格式
2.2准备
为类或接口的静态字段赋默认值
2.3解析
将常量池的符号引用转换为直接引用
3.初始化
执行静态代码块,为静态变量赋值