【问题标题】:Which class loader is responsible for loading the very first class to be loaded?哪个类加载器负责加载第一个要加载的类?
【发布时间】:2020-01-15 02:58:00
【问题描述】:

根据this JVM specificationC 的类加载器由触发C 加载的D 确定:

Java 虚拟机使用三个过程之一来创建类 或者接口CN表示:

  • 如果N 表示非数组类或接口,则两者之一 以下方法用于加载并由此创建C

    • 如果 D 由引导类加载器定义,则引导 类加载器启动 C 的加载(第 5.3.1 节)。

    • 如果 D 是由用户定义的类加载器定义的, 那么同样 用户定义的类加载器启动 C 的加载(第 5.3.2 节)。

  • ...

那么,基本情况呢?我的意思是,将加载第一个类,显然D 在这种情况下无法定义

【问题讨论】:

  • 这就是规范所指的引导类加载器
  • @ernest_k 我希望如此。但是,你能从规范中找出具体的措辞吗?
  • 你的“基本情况”是什么?您是在询问在 JVM 中加载/创建的第一个类(大概是 java.lang.Object)还是关于应用程序类(包含 main 方法的类)?
  • @Holger 嗯,我最初的意思是任何无法定义D 的情况。如果这两个案例属于同一情况,我对两者都感兴趣。
  • 嗯,这是两种完全不同的情况。当 JVM 初始化自己时,它必须自己初始化类 ObjectStringClassClassLoader(以及更多),因为 Java 端类加载取决于它们。此外,这些类具有循环依赖关系。因此,只有在以特定于实现的方式准备好这些类之后,它才能真正遵循正式的过程。另一方面,当一切准备就绪时,使用 system class loader 加载主类。

标签: java jvm language-lawyer


【解决方案1】:

5.2. Java Virtual Machine Startup中指定:

Java 虚拟机通过使用引导类加载器(第 5.3.1 节)或用户定义的类加载器(第 5.3.2 节)创建初始类或接口来启动。 Java 虚拟机然后链接初始类或接口,对其进行初始化,并调用公共静态方法void main(String[])。调用此方法会驱动所有进一步的执行。执行构成主要方法的 Java 虚拟机指令可能会导致链接(并因此创建)其他类和接口,以及调用其他方法。

初始类或接口以依赖于实现的方式指定。例如,初始类或接口可以作为命令行参数提供。或者,Java 虚拟机的实现本身可以提供一个初始类,该类设置一个类加载器,该类加载器反过来加载一个应用程序。初始类或接口的其他选择是可能的,只要它们与上一段中给出的规范一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多