Java类加载器(ClassLoader)知识点总结

Java类加载器(ClassLoader)知识点总结

概述

本文档是对Java类加载器(ClassLoader)相关视频的知识点总结,重点介绍Java类加载机制、双亲委派模型以及使用Arthas工具分析类加载问题的方法。

类加载器基础知识

什么是类加载器(ClassLoader)

类加载器负责将Class文件(字节码)加载到内存中,转为JVM能够识别的Class对象。Java程序运行时,并不是一次性将所有类加载到内存,而是按需加载。

Java默认提供的三种类加载器

  1. Bootstrap ClassLoader(启动类加载器)

    • 负责加载JDK核心类库,如java.lang.*, java.util.*等rt.jar中的类
    • 由C/C++实现,在Java中无法直接引用,表现为null
    • 代码示例见BootstrapClassLoaderDemo.java
  2. Extension ClassLoader(扩展类加载器)

    • 负责加载JDK扩展目录($JAVA_HOME/jre/lib/ext)中的类库
    • 代码示例见ExtClassLoaderDemo.java
  3. Application ClassLoader(应用程序类加载器)

    • 负责加载classpath路径下的类库,包括用户自定义类和Maven依赖
    • 也称为System ClassLoader(系统类加载器)
    • 代码示例见AppClassLoaderDemo.java

双亲委派模型(Parents Delegation Model)

基本原理

当一个类加载器收到类加载请求时,它首先不会自己尝试加载这个类,而是委派给父类加载器去完成。只有当父类加载器无法找到这个类时(在其搜索范围内找不到该类),子类加载器才会尝试自己加载。

委派流程

  1. AppClassLoader收到加载请求
  2. 将请求委派给ExtClassLoader
  3. ExtClassLoader将请求委派给BootstrapClassLoader
  4. BootstrapClassLoader尝试加载,如果找不到类
  5. 则ExtClassLoader尝试加载,如果找不到类
  6. 最后由AppClassLoader尝试加载

双亲委派的优点

  1. 安全性:防止核心API被篡改,例如无法自定义java.lang.String
  2. 避免重复加载:父加载器已加载的类,子加载器不会再次加载

使用Arthas工具分析类加载问题

Arthas简介

Arthas是阿里巴巴开源的Java诊断工具,它可以帮助开发人员分析生产环境中的各种问题,包括类加载问题。

常用命令

  1. sc命令:查看已加载的类信息

    sc -d 全类名  # 查看类的详细信息
    
  2. classloader命令:查看类加载器

    classloader -t  # 查看类加载器层次关系
    classloader -l  # 列出所有类加载器
    
  3. trace命令:跟踪方法调用

    trace 类名 方法名  # 跟踪方法执行过程
    

实际案例

项目中的AppClassLoaderDemo.java演示了如何查看不同类的类加载器:

  • 自定义的Student类由AppClassLoader加载
  • Maven依赖中的FileUtils类也由AppClassLoader加载

破坏双亲委派模型

在一些特殊场景下,需要自定义类加载器来破坏双亲委派模型:

  1. SPI机制(Service Provider Interface):如JDBC、日志框架等
  2. 热部署/热加载:如在Tomcat中,不同应用使用各自的类加载器
  3. OSGI:动态模块化系统,每个Bundle有自己的类加载器

总结

类加载器是Java虚拟机的重要组成部分,它将Java程序的字节码动态加载到内存中。理解类加载器的工作原理和双亲委派模型对于解决类加载相关问题、防止类加载安全漏洞具有重要意义。通过Arthas等工具,我们可以更便捷地分析和解决类加载问题。

觉得有用的话可以点点赞 (/ω\),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦 >人< 。