JVM(Java虚拟机)类加载子系统是Java运行时环境的重要组成部分

JVM(Java虚拟机)类加载子系统是Java运行时环境的重要组成部分,它负责将编译后的Java类(.class文件)加载到内存中,并对其进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。以下是关于JVM类加载子系统的详细解释:

一、类加载过程

一个类的完整生命周期包括加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中,加载、验证、准备、解析和初始化是类加载过程的前五个阶段,也是类加载子系统主要关注的部分。

  1. 加载(Loading)

    • 通过一个类的全限定名获取定义此类的二进制字节流。
    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  2. 验证(Verification)

    • 目的在于确保Class文件的字节流中包含的信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。
    • 主要包括四种验证:文件格式验证、元数据验证、字节码验证和符号引用验证。
  3. 准备(Preparation)

    • 为类变量分配内存并设置类变量初始值。这些内存都将在方法区中分配(在JDK 7及之后的版本中,某些类变量可能会随着Class对象一起存放在Java堆中)。
    • 初始值通常是数据类型默认的零值(如0、0L、null、false等)。对于被final修饰的类变量,在准备阶段就会被赋予用户希望的值。
  4. 解析(Resolution)

    • 将常量池内的符号引用转换为直接引用的过程。
    • 符号引用就是一组符号来描述目标,可以是任何字面量。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
    • 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。
  5. 初始化(Initialization)

    • 执行类构造器()方法的过程。
    • ()方法由javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。
    • 若该类具有父类,JVM会保证子类的()执行前,父类的()已经执行完毕。

二、类加载器

类加载器负责加载所有的类,所有被载入内存中的类都生成一个java.lang.Class实例对象,该对象用于代表该类。JVM预定义有三种类加载器:

  1. 根类加载器(Bootstrap ClassLoader)

    • 最顶层的加载类,由C++实现,负责加载$JAVA_HOME/lib目录下的jar包和类或者被-Xbootclasspath参数指定的路径中的所有类。
    • 它不是ClassLoader的子类,因此无法被Java程序直接引用。
  2. 扩展类加载器(Extension ClassLoader)

    • 主要负责加载$JRE_HOME/lib/ext目录下的jar包和类,或被java.ext.dirs系统变量所指定的路径下的jar包。
    • 由Java语言实现,是ClassLoader的子类。
  3. 系统类加载器(System ClassLoader,也称为应用程序类加载器Application ClassLoader)

    • 面向用户的加载器,负责加载当前应用classpath下的所有jar包和类。
    • 父类加载器为扩展类加载器。

除了这三种预定义的类加载器外,用户还可以自定义类加载器,通过继承java.lang.ClassLoader类并重写其方法来实现。自定义类加载器可以用于隔离加载类、修改类加载的方式、扩展加载源以及防止源码泄露等场景。

三、双亲委派模型

在Java的类加载器中,采用了一种双亲委派模型。当一个类加载器收到类加载请求时,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。如果父类加载器找不到指定的类,那么子类加载器才会尝试自己去加载这个类。这种模型可以确保Java核心类库的类型安全,避免类的重复加载。

综上所述,JVM类加载子系统是Java运行时环境的关键组成部分,它负责将编译后的Java类加载到内存中,并对其进行校验、转换解析和初始化。通过类加载器和双亲委派模型,JVM能够确保类的正确加载和类型安全。

相关推荐
PPPPickup3 分钟前
easychat---创建,获取,获取详细,退群,解散,添加与移除群组
java·开发语言·后端·maven
luod3 分钟前
SpringBoot自动初始化数据
java·spring boot·spring
牛顿没有错4 分钟前
lombok中@Data、@AllArgsConstructor、@NoArgsConstructor不生效
java·spring boot·spring·intellij-idea
南部余额29 分钟前
深入理解 Spring Boot:自动化配置类与 FactoryBean 的异同与协作
java·spring boot·自动化
摇滚侠32 分钟前
2025最新 SpringCloud 教程,熔断规则-熔断策略-异常数,笔记46
java·笔记·spring cloud
Home33 分钟前
23 种设计模式--桥接(Bridge)模式(结构型模式二)
java·后端
摇滚侠34 分钟前
2025最新 SpringCloud 教程,熔断规则-熔断策略-慢调用比例,笔记44
java·笔记·spring cloud
s***117038 分钟前
使用rustDesk搭建私有远程桌面
java
编程修仙44 分钟前
第九篇 Spring中的代理思想
java·后端·spring
杀死那个蝈坦1 小时前
MyBatis-Plus 使用指南
java·kafka·tomcat·mybatis—plus