返回

亲探JVM第二章-类文件到虚拟机

后端

在第一篇文章中,我们探讨了 Java 虚拟机 (JVM) 和字节码的基本知识。这为我们理解 Java 代码是如何被执行提供了基础。现在,让我们更深入地探索 JVM 的工作原理,了解 class 文件是如何被加载到 JVM 中并最终执行的。

揭秘class文件格式

class 文件是包含 Java 代码的二进制文件。它由一系列字节组成,这些字节按照严格的格式排列,以便 JVM 能够理解和解释它们。class 文件的格式由 Java 虚拟机规范 (JVM 规范) 定义,它指定了 class 文件中必须包含哪些信息以及这些信息应该如何组织。

class 文件包含了许多信息,包括:

  • 魔数 (Magic Number): 一个表示 class 文件类型的数字。
  • 主版本号 (Major Version Number) 和 次版本号 (Minor Version Number): 这两个数字指定了 class 文件与特定 JVM 版本的兼容性。
  • 常量池 (Constant Pool): 一个存储字符串、类名和其他常量的表。
  • 访问标志 (Access Flags): 一组位,指示类的访问权限(例如,它是否是 public、private 或 protected)。
  • 此类的名字 (This Class): 一个指向常量池中类名的索引。
  • 父类的名字 (Super Class): 一个指向常量池中父类名的索引。
  • 接口 (Interfaces): 一个指向常量池中实现的接口名的索引列表。
  • 字段 (Fields): 一个存储类字段信息(例如,它们的类型和访问权限)的表。
  • 方法 (Methods): 一个存储类方法信息(例如,它们的类型和访问权限)的表。
  • 属性 (Attributes): 一个包含其他信息的表,例如代码、异常处理表和调试信息。

类加载过程

当 JVM 启动时,它会创建一个称为类加载器的组件。类加载器的作用是将 class 文件加载到 JVM 中。类加载器的工作过程如下:

  1. 查找类: 类加载器首先会尝试在本地文件系统或网络上找到包含要加载的类的 class 文件。
  2. 加载类: 一旦找到 class 文件,类加载器就会将其加载到 JVM 中。这包括解析 class 文件的二进制格式并将类信息存储在 JVM 的内存中。
  3. 链接类: 类加载后,类加载器会对其进行链接。链接过程包括验证类的结构是否正确、将类中的符号引用解析为实际的类和方法引用,以及初始化类的静态字段。
  4. 初始化类: 最后,类加载器会初始化类。初始化过程包括执行类的静态初始化程序(如果有的话)和分配类的实例。

剖析JVM的工作原理

JVM 在加载和执行类时会经历一系列步骤。这些步骤包括:

  1. 字节码解释: JVM 会将 class 文件中的字节码解释为一组指令。这些指令由 JVM 的解释器执行。
  2. 即时编译: JVM 还可以将字节码编译为本地机器代码。这称为即时编译 (JIT)。JIT 编译后的代码比解释执行的代码运行得更快。
  3. 垃圾回收: JVM 会在不再使用的对象时自动回收它们的内存。这称为垃圾回收。垃圾回收有助于防止内存泄漏并确保 JVM 能够高效运行。

总结

在本章中,我们深入探讨了 class 文件的格式、类加载过程和 JVM 的工作原理。这些知识对于理解 Java 代码是如何被执行的非常重要。在下一篇文章中,我们将继续探索 JVM 的其他功能,例如异常处理、多线程和安全。