美文网首页
深入理解JVM,加载、链接、初始化

深入理解JVM,加载、链接、初始化

作者: 坑王老薛 | 来源:发表于2018-12-10 22:10 被阅读63次

    深入理解JVM

    编译原理请查看之前内容,需要了解更多Java原创资料,请加qq:1811112688,或者加老薛的微信,在个人介绍中。

    编译、加载过程

    image

    java虚拟机何时会结束什么周期?

    i:正常执行完毕程序
    ii:执行了System.exit();
    iii:程序执行期间发生了异常或者错误而终止
    iv:由于底层操作系统出错,导致虚拟机结束进程
    

    classloader将数据加载到内存中经过的步骤:

    image

    i、加载:加载类的二进制数据
    ii、链接
    .验证 确保加载的类的正确性。
    .准备 类中的静态变量分配内存,并且其初始化为默认值。
    .解析 把类中的符号引用变为直接引用。
    iii、初始化
    为类中的类中的静态变量赋值(正确的初始值)

    如何确定一个类被加载了?

    Java程序对于类的使用分为两个部分:

    i:主动使用
       A:创建一类的实例 new Person();
       B*:访问某个类、接口中的静态变量,或者对于静态变量做读写;
       C:调用类中的静态方法;
       D:反射 (Class.forName("xxx.xxx.xxx"));
       E*:初始化一个类的子类的,当前类加载。
       F:Java虚拟机标明的启动器类(Test.class(main)|Person.class|Student.class,此时Test就是启动器类).
    ii:被动使用
       a:引用常量不会导致该类发生初始化[常量它是在编译器确定的]
       b: 通过数组定义类的引用,不会触发该类的初始化
       c:通过子类引用父类的静态变量,不会导致子类初始化。
       剩余的都是被动使用。。。
    

    加载.class文件的方式:

    -1:本地系统当中直接加载 *
    -2:通过网络下载.class文件
    -3:从jar、zip等归档文件中加载.class文件 *
    -4:数据库(.class文件)
    -5:动态编译.class
    

    当一个类加载到内存中之后,会在堆内存当中产生一个对应的Class的对象,所有当前的类的
    实例以及当前该类都共享这一份Class实例。

    类加载器

    java虚拟机自带的加载器:
        根类加载器(bootstrap)
        扩展类加载器(PlatformClassLoader、低版本 Ext)
        系统类加载器(AppClassLoader) 
    用户自定义加载器
        java.lang.ClassLoader的子类
        可以定制类的加载方法   
    

    注意:类加载器并不需要等到一个类"首次主动使用"时在加载它。
    可以预先加载。JVM规范中定义类,类加载器可以在预料到某个类可能
    需要加载时预先加载。
    hotspot、jrokit、j9都是对于JVM规范的一种实现。

    相关文章

      网友评论

          本文标题:深入理解JVM,加载、链接、初始化

          本文链接:https://www.haomeiwen.com/subject/sxhjhqtx.html