java程序启动时会发生什么?

时间:2012-12-18 06:03:04

标签: java jar jvm classloader executable-jar

最近有人接触过Java类加载器并突然认识到,当有人调用

时,不能完全理解循序渐进会发生什么
java -jar App.jar

嗯,我想

  1. 创建了一个新的JVM实例
  2. 它使用ClassLoader加载主类和其他类
  3. 字节代码从main()方法
  4. 开始执行

    但我仍然认为有很多事情我需要了解更多。

    • 谁和如何决定在启动时应该加载哪些类以及哪些类曾经需要?

    我找到了两个相关问题,但没有解释如何将其应用于Java现实。

    What happens when a computer program runs?

    What happens when you run a program?

4 个答案:

答案 0 :(得分:2)

  

•谁和如何决定在启动时应该加载哪些类以及哪些类需要?

我们需要了解java类加载的基础知识。最初的bootstrap类加载器(它本身作为VM本身的一部分实现)负责加载核心系统类。然后还有其他类加载器以及扩展,系统,用户定义(可选)类加载器,它们决定何时以及如何加载类。 Fundamentals of class loading

答案 1 :(得分:1)

决定由类加载器决定。有不同的实现,其中一些预加载它们可以的所有类,一些只在需要时加载类。

第一次从程序代码访问时,只需需要 ;此访问可以是来自该类的对象的实例化,也可以是对其static个成员之一的访问。通常,默认的类加载器会在需要时懒惰地加载类。

在任何情况下都不能依赖某些类进行预加载:在实际执行此代码之前,可能无法确定通过Class.forName(...)访问的类。

在其他选项中,对于简单的实验,您可以使用静态初始化程序代码来查看实际加载类的实际时间和顺序;这个代码将在第一次加载类时执行;例如:

class SomeClass {

    static {
        System.out.println("Class SomeClass was initialized.");
    }

    public SomeClass() {
        ...
    }

    ...

}

答案 2 :(得分:0)

您的示例显示了一个可执行jar ,它只是一个普通的java存档(jar),在其清单文件中有一个额外的键/值对(位于文件夹"META_INF"中)。关键是“Main-Class”,如果你像运行中那样“运行”jar,那么该类的完全限定类名将被执行“main”方法。

jar是一个zip文件,您可以查看每个zip存档工具。

答案 3 :(得分:0)

无论何时编译Java程序,都会执行以下步骤

  1. 首先,类加载器将类加载到JVM中。
  2. 在给出命令 javac filename.java 之后,编译器检查编译时错误,如果一切正常则会生成.Class文件(字节代码)。
  3. 这将是第一阶段。

    稍后解释器检查运行时错误,如果一切正常,没有异常,则解释器将字节代码转换为可执行代码。

    java的第一阶段由JIT编译器完成(及时)。