JVM中类的卸载机制
来源:互联网 发布:支持python的虚拟主机 编辑:程序博客网 时间:2024/05/18 01: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实例(可以通过哈希码查看是否是同一个实例)。
关于类的卸载机制转自:http://www.cnblogs.com/mengdd/p/3594608.html
- JVM中类的卸载机制
- JVM中类的卸载机制
- JVM中类的卸载机制
- JVM中类加载的机制
- JVM中Java类的加载机制
- 从JVM分析Java的类的加载和卸载机制
- Java 类的卸载机制
- JVM(十三) 类的卸载
- JVM中类加载器的父委托机制
- JVM 加载类的机制
- JVM的类加载机制
- JVM 的类初始化机制
- JVM--类的加载机制
- JVM中ClassLoader的工作机制
- 【JVM】JVM类加载机制
- JVM加载一个类的机制
- JVM的虚拟机类加载机制
- JVM:Java 类的加载机制
- 计算BitmapFactory.Options.inSampleSize的缩放比算法工具
- Datastax文档Apache Cassandra v2.1 第一部分 关于Apache Cassandra和CQL
- Objective-C之数据持久化-对象归档
- Something about uiwindow
- 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
- JVM中类的卸载机制
- (十九)由一个bug想到的:使用jQuery和angularJS需要注意的事
- (乙)1010. 一元多项式求导
- JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
- k近邻算法
- SpringMVC中Shiro报错org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible
- LeetCode题解——Reverse Linked List
- Adapter
- OpenCV 为啥勾搭上 OpenGL?