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.初始化

执行静态代码块,为静态变量赋值