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

    http://www.cnblogs.com/mengdd/p/3594608.html

    类的生命周期

      当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视频教程。

  • 相关阅读:
    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据
    Pod常使用命令
    教你用SingalR实现后台开发程序运行时时检测
    技术博客收藏
    ASP.NET SingalR 点对点聊天实现思路总结
    浅谈对MJRefresh(上)下拉刷新控件的理解
    redis持久化RDB和AOF
    redis的发布和订阅
    Linux下安装Redis
    python开发之virtualenv与virtualenvwrapper
  • 原文地址:https://www.cnblogs.com/a757956132/p/4744428.html
Copyright © 2011-2022 走看看