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

最近一直被感动的Java类加载器,并突然意识到,不完全明白当有人打电话时一步一步发生的事情

java -jar App.jar

那么我猜

  • 将创建一个新的JVM实例
  • 它使用ClassLoader来加载主类和其他类
  • 字节码从main()方法开始执行
  • 但我仍然认为有很多事情我需要更多地了解它。

  • 谁以及如何决定在启动时加载哪些类以及哪些类需要?
  • 我发现了两个相关的问题,但没有解释如何将其应用于Java实际。

    计算机程序运行时会发生什么?

    当你运行一个程序时会发生什么?


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

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


    这个决定是由类加载器做出的。 有不同的实现,其中一些预加载所有可能的类,一些只在需要时加载类。

    一个类只需要在第一次从程序代码访问时加载; 此访问可能是该类的对象的实例化或对其static成员之一的访问。 通常,默认的类加载器将在需要时延迟加载类。

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

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

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

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

    一个jar是一个zip文件,你可以用每个zip归档工具看看里面的内容。

    链接地址: http://www.djcxy.com/p/11607.html

    上一篇: What happens when java program starts?

    下一篇: git remove all deleted files from entire history