描述一下 JVM 加载 class 文件的原理机制

参考答案

1.  JVM 中类的装载,是由类加载器(ClassLoader)和它的子类来实现的。

  • Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。

2.  由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。

  • 当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
  • 类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的 Class 对象。

3.  加载完成后,Class 对象还不完整,所以此时的类还不可用。

4.  当类被加载后就进入连接阶段,这一阶段包括三个步骤:

  • 验证
  • 准备(为静态变量分配内存并设置默认的初始值)
  • 解析(将符号引用替换为直接引用)

5.  最后 JVM 对类进行初始化,包括:

  • 如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
  • 如果类中存在初始化语句,就依次执行这些初始化语句。

6.  类的加载是由类加载器完成的,类加载器包括:

  • 根加载器(BootStrap)
  • 扩展加载器(Extension)
  • 系统加载器(System)
  • 用户自定义类加载器(java.lang.ClassLoader 的子类)

从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性,在该机制中,JVM 自带的Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向 Java 程序提供对 Bootstrap 的引用。

下面是关于几个类加载器的说明:

  • Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
  • Extension:从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap;
  • System:又叫应用类加载器,其父类是 Extension。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性
    java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。

 

以上,是JVM面试题【描述一下JVM加载class文件的原理机制】的参考答案。

输出,是最好的学习方法

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧