转载:https://www.cnblogs.com/macgradyjames/p/7404054.html

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

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

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

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

具体的例子为:

JVM卸载字节码文件

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

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

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

相关文章:

  • 2021-07-11
  • 2022-03-04
  • 2022-12-23
  • 2022-12-23
  • 2021-04-13
  • 2020-09-29
  • 2021-10-04
猜你喜欢
  • 2022-01-01
  • 2022-12-23
  • 2021-09-01
  • 2022-12-23
  • 2021-06-25
相关资源
相似解决方案