zoukankan      html  css  js  c++  java
  • JVM中类的卸载机制

    类的生命周期

      当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实例(能够通过哈希码查看是否是同一个实例)。

    关于类的卸载机制转自:http://www.cnblogs.com/mengdd/p/3594608.html

     

  • 相关阅读:
    Unity异步加载场景loading条
    (转)Unity3D命令行Build
    (转)Unity3d UnityEditor编辑器定制和开发插件
    (转)U3D不同平台载入XML文件的方法——IOS MAC Android
    Unity3D中的欧拉角的理解
    (转)在ios android设备上使用 Protobuf (使用dll方式)
    (转)[原创]在ios android设备上使用 Protobuf (使用源码方式)
    (转)欧拉角与万向节死锁
    (转) unity 在移动平台中,文件操作路径详解
    微信小程序四(设置底部导航)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8397268.html
Copyright © 2011-2022 走看看