zoukankan      html  css  js  c++  java
  • Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制

    类的生命周期

      当Sample类被加载、连接和初始化后,它的生命周期就开始了。

      当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。

      由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期

    引用关系

      加载器和Class对象:

      在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。

      另一方面,一个Class对象总是会引用它的类加载器。调用Class对象的getClassLoader()方法,就能获得它的类加载器。

      由此可见,Class实例和加载它的加载器之间为双向关联关系

      类、类的Class对象、类的实例对象:

      一个类的实例总是引用代表这个类的Class对象。

      在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。

      此外,所有的Java类都有一个静态属性class,它引用代表这个类的Class对象。

    类的卸载

      由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。

      前面介绍过,Java虚拟机自带的类加载器包括根类加载器扩展类加载器系统类加载器

      Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的

      由用户自定义的类加载器加载的类是可以被卸载的。

    具体例子

     

      loader1变量和obj变量间接应用代表Sample类的Class对象,而objClass变量则直接引用它。

      如果程序运行过程中,将上图左侧三个引用变量都置为null,此时Sample对象结束生命周期,MyClassLoader对象结束生命周期,代表Sample类的Class对象也结束生命周期,Sample类在方法区内的二进制数据被卸载

      当再次有需要时,会检查Sample类的Class对象是否存在,如果存在会直接使用,不再重新加载;如果不存在Sample类会被重新加载,在Java虚拟机的堆区会生成一个新的代表Sample类的Class实例(可以通过哈希码查看是否是同一个实例)。

    参考资料

      圣思园张龙老师Java SE视频教程。

     博文源于:

     

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/hqlong/p/6814414.html
Copyright © 2011-2022 走看看