Java学习手册:JVM加载class文件的原理机制

本文深入探讨Java类加载机制,包括加载方式、时机、不同加载器的责任与过程,以及类加载的步骤。揭示了Java如何动态加载类,以及双亲委派模型的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器来完成的,具体地说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。

一、类的加载方式

类的加载方式分为隐式加载显式加载两种。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类地加载器把对应的类加载到JVM中显式加载指的是通过直接调用class.forName()方法来把所需的类加载到JVM中


二、类的加载时机

虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(class文件加载到JVM中):

  • 创建类的实例(new 的方式)。访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法
  • 反射的方式
  • 初始化某个类的子类,则其父类也会被初始化
  • Java虚拟机启动时被标明为启动类的类,直接使用java.exe命令来运行某个主类(包含main方法的那个类)
  • 当使用JDK1.7的动态语言支持时

三、各个加载器的工作责任

在Java语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类完全加载到JVM中,至于其他类,则在需要时才加载。在Java语言中,可以把类分为3类:系统类扩展类自定义类。Java针对3种不同的类提供了3种类型的加载器:
①Bootstrap Loader——负责加载系统类
②ExtClassLoader——负责加载扩展类
③AppClassLoader——负责加载应用类
以上三个类通过委托的方式来完成类的加载。具体而言,就是当有类需要被加载时,类加载器会请求父类来完成这个载入工作,父类会使用其自己的搜索路径来搜索需要被载入的类,如果搜索不到,才会由子类按照其搜索路径来搜素待加载的类。


四、各个加载器的工作过程

1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
2、当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
3、如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
4、若ExtClassLoader也加载失败,则会使用AppClassLoader来加载
5、如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
其实这就是所谓的双亲委派模型。简单来说:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上。

特别说明:
类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。


五、类加载的步骤

类加载的主要步骤分为以下3步:
(1)装载。根据查找路径找到相对应的class文件,然后导入。
(2)链接。链接又可以分为3个小的步骤,具体如下:
①检查。检查待加载的class文件的正确性。
②准备。给类中的静态变量分配存储空间。
③解析。将符号引用转换成直接引用(可选)。
(3)初始化。对静态变量和静态代码块执行初始化工作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值