JVM工作原理与实战(八):类加载器的分类

简介: JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类加载器、类加载器的分类等内容。

一、类加载器介绍

类加载器(ClassLoader)是Java虚拟机(JVM)提供的一种机制,用于动态加载类和接口的字节码数据到内存中。类加载器是Java虚拟机的重要组成部分,它负责在运行时将类的字节码文件加载到内存中,并创建对应的Class对象,以供JVM解释和执行。

类加载器在加载阶段主要完成以下任务:

  • 加载:类加载器首先会从文件系统、JAR文件或网络加载类的字节码文件,将其转换为可执行的Java类。
  • 链接:链接阶段包括验证、准备和解析三个子阶段。验证是为了确保被加载的类文件是安全的,准备是分配内存并初始化为默认值,解析是将符号引用转换为直接引用。
  • 初始化:在初始化阶段,类加载器会执行类构造器方法(<clinit>()),该方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块集合来的。


本地接口JNI,全称为Java Native Interface,为Java提供了一种与其他语言编写的代码进行交互的机制。这使得Java可以调用非Java语言(如C、C++等)编写的函数和方法。在HotSpot类加载器中,JNI主要用于与使用C++编写的Java虚拟机内部方法进行交互。

二、类加载器的分类

类加载器可以分为两类:Java代码实现的类加载器Java虚拟机底层源码实现的类加载器

1.Java代码实现的类加载器

Java代码实现的类加载器主要是通过继承ClassLoader这个抽象类来实现的。JDK中默认提供了多种处理不同渠道的类加载器,比如从文件系统、JAR文件或网络加载类的类加载器。程序员也可以根据需求自定义类加载器,以实现特定的类加载逻辑。

查看ClassLoader的子类(项目中的类加载器):

image.gif

2.Java虚拟机底层源码实现的类加载器

Java虚拟机底层源码实现的类加载器,例如Hotspot中的类加载器,是用底层语言(如C++)实现的。这些类加载器在Java虚拟机的实现中扮演着重要的角色,负责在程序运行时加载基础类,以确保这些核心类的可靠性和稳定性。

由于基础类是Java平台的核心组成部分,因此它们的加载必须非常可靠和高效。Java虚拟机底层源码实现的类加载器直接与操作系统交互,使用底层语言的性能优势来加载类。这些类加载器通常与虚拟机的其他部分紧密集成,以确保正确的类加载和初始化过程。

这些类加载器通常具有以下特点:

  • 高性能:由于使用底层语言实现,这些类加载器可以直接与操作系统交互,避免了Java代码到本地代码的转换开销,从而提供了更高的性能。
  • 可靠性:由于直接与操作系统交互,这些类加载器具有更强的可靠性和稳定性,能够更好地处理异常情况和资源管理。
  • 安全性:由于直接集成到虚拟机的安全机制中,这些类加载器提供了更强的安全性保障,能够防止恶意代码的加载和执行。

3.默认的类加载器层次(JDK8及之前的版本)

对于JDK8及之前的版本,默认的类加载器层次结构如下:

  • 启动类加载器(Bootstrap):这是最顶层的类加载器,负责加载Java的核心类库,如java.lang包中的类等。它是用C++编写的,是Java虚拟机底层实现的一部分。
  • 扩展类加载器(Extension):这是Bootstrap的子类加载器,负责加载Java的扩展类库。它是ClassLoader的子类,通过调用父类的loadClass()方法来加载类。
  • 应用程序类加载器(Application):这是Extension的子类加载器,负责加载应用程序的类。它是ClassLoader的子类,通过调用父类的loadClass()方法来加载类。

使用Arthas查看类加载器:

classloader

image.gif

classloader命令将 JVM 中所有的 classloader 的信息统计出来,并可以展示继承树,urls 等。

参数名称 参数说明
[l] 按类加载实例进行统计
[t] 打印所有 ClassLoader 的继承树
[a] 列出所有 ClassLoader 加载的类(谨慎使用)
[c:] ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[c: r:] 用 ClassLoader 去查找 resource
[c: load:] 用 ClassLoader 去加载指定的类

案例:

启动以下程序:

public class Test {
    public static final int i = 1;
    public static void main(String[] args) throws IOException {
        Test test = new Test();
        System.in.read();
    }
}

image.gif

启动Arthas,并选择Test:

java -jar arthas-boot.jar

image.gif

运行结果:

image.gif

image.gif

输入classloader命令将 JVM 中所有的 classloader 的信息统计出来:

classloader

image.gif

统计结果:

image.gif

结果解析:

BootstrapClassLoader 启动类加载器(C++实现)
ArthasClassloader Arthas类加载器
ExtClassLoader 扩展类加载器
DelegatingClassLoader

反射代理类加载器

AppClassLoader 应用程序类加载器

总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了类加载器、类加载器的分类等内容,希望对大家有所帮助。

相关文章
|
7月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
689 55
|
7月前
|
Oracle Java 关系型数据库
JVM深入原理(一+二):JVM概述和JVM功能
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行。
209 0
|
7月前
|
Arthas 存储 Java
JVM深入原理(三+四):JVM组成和JVM字节码文件
目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
134 0
|
7月前
|
存储 安全 Java
JVM深入原理(五):JVM组成和JVM字节码文件
类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
112 0
|
7月前
|
Arthas Java 测试技术
JVM深入原理(六)(一):JVM类加载器
目录6. JVM类加载器6.1. 类加载器-概述6.2. 类加载器-执行流程6.3. 类加载器-分类(JDK8)6.3.1. JVM底层实现的类加载器6.3.1.1. 启动类加载器6.3.2. Java代码实现类的加载器6.3.2.1. 扩展类加载器6.3.2.2. 应用程序类加载器6.4. 类加载器-Arthas查看类加载器
137 0
|
2月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
243 5
|
2月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
8月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
670 6
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
2079 1
|
11月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1055 166