博客
关于我
Java虚拟机JVM学习07 类的卸载机制
阅读量:430 次
发布时间:2019-03-06

本文共 1021 字,大约阅读时间需要 3 分钟。

 

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

转载地址:http://iiqyz.baihongyu.com/

你可能感兴趣的文章
FeWeb基础之JavaScript简介
查看>>
设计模式学习笔记(二十三:解释器模式)
查看>>
使用MongoDB和JSP实现一个简单的购物车系统
查看>>
算法笔记_069:Floyd算法简单介绍(Java)
查看>>
Python学习笔记_05:使用Flask+MySQL实现用户登陆注册以及增删查改操作
查看>>
Deepin_使用Python+MySQL创建工作日志记录
查看>>
dpdk在虚拟机上出错处理
查看>>
Macbook 彻彻底底的卸载MySQL
查看>>
ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证
查看>>
SSIS 转移数据库和SQL Server对象组件
查看>>
SQL Server 列存储索引 第二篇:设计
查看>>
ADF 第五篇:转换数据
查看>>
Databricks 第4篇:pyspark.sql 分组统计和窗口
查看>>
博客系列目录
查看>>
部署AlwaysOn第二步:配置AlwaysOn,创建可用性组
查看>>
PowerBI开发 第八篇:查询参数
查看>>
Execute SQL Task 第二篇:返回结果集
查看>>
我眼中的项目经理
查看>>
SSISDB2:SSIS工程的操作实例
查看>>
业务工作流平台设计(七)
查看>>