JVM Loading,Linking 和 Initializing 之 VM Startup 和 Creation and Loading

来源:互联网 发布:军用地图软件 编辑:程序博客网 时间:2024/06/06 09:09

JVM 通过创建一个初始的类来启动,这个类不依赖实现,使用bootstrap class loader(启动加载器)来加载。然后,JVM link 初始类,initialize 它并且调用它的 main 方法。对这个main 方法的调用引起其他方法的执行。JVM 指令的执行由main 方法组成可能引起 linking 附加的类和接口以及附加的方法的调用。

         在一些JVM的实现中,初始的类可以由命令行参数提供。同样,初始的类也可以由实现提供。在初始化类可能准备了一个加载器,这个加载器反过来加载一个应用。只要初始类符合细则的规定,你也可以选择其他的初始类。

 

根据标记为N的类或接口C的创建过程由有接口C的内部实现的JVM 的方法区域的构建组成。通过运行期的常量池引用C的类或接口D触发了C的创建。类或接口也可能通过D调用JAVA 类库中的方法来创建,比如反射。
    如果C 是非数组类,它通过加载一个C的二进制表示来创建。数组类没有外部的二进制表示;他们是被JVM创建而不是类加载器。
    类加载器分为两种类型:用户定义的类加载器和由JVM 提供的启动加载器。每一个类加载器是抽象类ClassLoader 的子类的实例。应用为了继承JVM动态加载和创建类而应用类加载器。用户定义的类加载器可以被用作创建用户定义源的类。比如:一个类可以从网络下载,从空中创建,或者从加密的文件中提取。
    类的加载器L 可能通过直接定义或通过另一个类加载器的代理来创建C。如果L直接创建C,我们可以说L 定义了C,或者,L是C的定义加载器。
    当一个类的加载器通过另一个类加载器的代理,那么这个初始化Loading 的加载器不一定是完成 Loading 和 定义类的加载器。如果L创建了C,可能通过直接定义或代理,我们可以说L 初始化C的loading ,或者L是C的初始化加载器。
    在运行期间,一个类或接口并不是单单由它的名字决定,而是由它的完全限定名和它的定义类加载器决定的。每一个这样的类或接口属于单一的一个运行包。一个类或接口的运行包由包的名字和类或接口的定义加载器决定。
    JVM 使用以下三个过程中的一个来创建标记为N的类或接口C:
1.    如果N是一个非数组类或一个接口,以下两个方法中的一个将被用做load 和创建C:
a)    如果D 是由启动类加载器定义的,那么启动类初始化C的loading。
b)    如果D是由用户定义的类加载器定义的,那么同样的用户定义的类加载器初始化C的loading。
2.    否则,如果N是一个数组类。数组类直接由JVM创建,而不是类的加载器。然而,D的定义类的加载器在创建数组类C的过程中使用。
我们有时候使用定义<N,Ld>代表一个类或接口,其中N代表类或接口的名字,Ld代表类或接口的定义加载器。我们也用定义 Nli代表一个类或接口其中N代表类或接口的名字,LI代表类和接口的一个初始加载器。

原创粉丝点击