Java 应用程序启动 - 第一个对象是如何创建的

Java application startup - how first object is created

当我们运行一个Java应用程序时,我们知道要加载的第一个对象是java.lang.Object。但是,java.lang.Object 有抛出异常的方法,例如 CloneNotSupportedExceptionInterruptedException,它们又是其他对象。

问题是:当 java.lang.Object 刚刚加载时,怎么可能已经创建了它的子对象(例如异常对象)?

loaded and instantiatedare two different things.

粗略解释:

loaded 表示 JVM 将 class 加载到其基础 class 加载器中。这使得 class 可用于 实例化 。当 JVM 启动时,它首先通过 used/linked jar 文件加载所有 classes,而不 实例化 它们。这意味着,当创建第一个 new Object() 时,Object 使用的异常是已知的。这仍然是一个宣言。只有在抛出特定异常时才会创建异常实例。

有关技术上正确的解释,请参阅@Jim Garrison 提到的 link:

JVM: Loading, Linking, and Initializing