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

相关文章
|
1月前
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
66 10
|
30天前
|
Rust 安全 Java
JVM原理与实现——Synchronized关键字
在多线程Java程序中,`Synchronized`关键字用于确保线程安全。本文深入探讨其工作原理,通过分析字节码`monitorenter`和`monitorexit`,解释JVM如何实现同步机制。文章展示了`Synchronized`方法的编译结果,并详细解析了轻量锁和重度锁的实现过程,包括Mark Word的状态变化及CAS操作的应用。最后简要介绍了`ObjectMonitor::enter()`函数在获取重度锁时的作用。
JVM原理与实现——Synchronized关键字
|
3月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
2月前
|
存储 IDE Java
实战优化公司线上系统JVM:从基础到高级
【11月更文挑战第28天】Java虚拟机(JVM)是Java语言的核心组件,它使得Java程序能够实现“一次编写,到处运行”的跨平台特性。在现代应用程序中,JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义、发展历史、主要概念、调试工具、内存管理、垃圾回收、性能调优等方面,并提供一个实际的问题demo,使用IntelliJ IDEA工具进行调试演示。
56 0
|
3月前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
3月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
77 2
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
531 1
|
3月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
51 4
|
1天前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
|
29天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型