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能够确保类的正确加载和类型安全。

相关推荐
装不满的克莱因瓶1 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗8 分钟前
常用类晨考day15
java
biomooc9 分钟前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人12 分钟前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar14 分钟前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound18 分钟前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
用余生去守护1 小时前
python报错系列(16)--pyinstaller ????????
开发语言·python
yuanbenshidiaos1 小时前
c++---------数据类型
java·jvm·c++
数据小爬虫@1 小时前
利用Python爬虫快速获取商品历史价格信息
开发语言·爬虫·python
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎