类的生命周期

在开始本节之前让我们再来回顾下类的生命周期

没看过前6个过程的同学建议从头看下《深入java虚拟机学习 -- 类的加载机制》,这里就不再过多介绍了,着重说下类的卸载

类的卸载

当Sample类被加载、连接和初始化后,它的生命周期就开始了,当代表Sample类的Class对象不在被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的声明周期。

由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。

注:由java虚拟机自带的三种类加载加载的类在虚拟机的整个生命周期中是不会被卸载的,由用户自定义的类加载器所加载的类才可以被卸载

java虚拟机自带的类加载器包含根类加载器、扩展类加载器、系统类加载器,Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用他们所加载类的Class对象,因此这些Class对象始终是可触及的。

类的引用关系

  1. 加载器和class对象
    在类加载器的内部实现中,用一个Java集合来存放所加载类的引用,另一方面,一个Class对象总是会引用他的类加载器,调用Class对象的getClassLoader方法就可以获得它的类加载器。由此可见,Class实例和加载它的加载器之间是双相关联关系。
  2. 类、类的class对象、类的实例对象
    一个类的实例总是引用代表这个类的Class对象,在Object类中定义类getClass方法,这个方法返回代表对象所属类的Class对象的引用。此外,所有的Java类都有一个静态属性class,他引用代表这个类的Class对象。

案例

这里我在看看上篇文章中的代码《深入java虚拟机学习 -- 类的加载机制(四)》

 Class clazz=loader.loadClass("Sample");
Object obj=clazz.newInstance();

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

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

当再次有需要时,会检查Sample类的Class对象是否存在,如果存在则会直接使用,不在重新加载,如果不存在,则Sample类会被重新加载,在Java虚拟机的堆区会重新生成一个代表Sample类的Class实例。

深入java虚拟机学习 -- 类的卸载的更多相关文章

  1. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  2. 深入java虚拟机学习 -- 类的加载机制

    当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...

  3. 深入java虚拟机学习 -- 类的加载机制(三)

    类的初始化时机 在上篇文章中讲到了类的六种主动使用方式,反射是其中的一种(Class.forName("com.jack.test")),这里需要注意一点:当调用ClasLoade ...

  4. 深入java虚拟机学习 -- 类的加载机制(四)

    类加载的命名空间 每个类加载器都有自己的命名空间,命名空间由所有以此加载器为初始类加载器的类组成,不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的refrence(反射),还是可以 ...

  5. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  6. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  7. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  8. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  9. java虚拟机学习-触摸java常量池(13-1)

    java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...

随机推荐

  1. 移动距离——第六届蓝桥杯C语言B组(省赛)第八题

    原创  问题描述: 移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号.比如:当小区排号宽度为6时,开始情形如下: ...

  2. git 恢复被修改的文件

    恢复到最后一次提交的改动:   git checkout filename 如果该文件已经 add 到暂存队列中,恢复文件:   git reset HEAD filename

  3. cxgrid的ImageComboBox属性学习

    1.点击Items设置右边有三个点按钮 2.Images属性绑定imagelist控件 3.点击Items即可选择显示的图片和文字 4.设置CxlookupcomboBox的高度 AutoSize设置 ...

  4. robotframework+jenkins分布式执行自动化测试用例

    http://blog.sina.com.cn/s/blog_53f023270101sc3w.html http://www.cnblogs.com/2test/p/5336842.html

  5. 解决SqlServer 2005 sa帐户不能登录问题

    允许 sa 用户远程是很危险的.推荐的做法是在本地新建一个允许远程连接的用户. 1.启用TCP/IP协议. 2.配置监听端口(1433). net -an 检查本地端口是否建立监听,使用 在线IP端口 ...

  6. leetcode 55. 跳跃游戏 JAVA

    题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: t ...

  7. windows测试登陆

    测试工具我使用2种(Medusa和hydra): 第一种:Medusa支持端口登录但是不支持rdp协议,意思就是可以验证密码是否正确,新用户不会创建家目录: 使用方法: medusa -M smbnt ...

  8. POJ - 2421 Constructing Roads (最小生成树)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  9. SFML从入门到放弃(2) 图像和音频

    SFML从入门到放弃(2) 图像和音频 精灵 精灵(sf::Sprite)就是截取纹理(sf::Texture)的一块 或者重复纹理贴图 初始化精灵和纹理的一些方法: sf::Sprite init_ ...

  10. PHP函数补完:call_user_func()

    call_user_func是PHP的内置函数,该函数允许用户调用直接写的函数并传入一定的参数,下面总结下这个函数的使用方法. 1,call_user_func函数类似于一种特别的调用函数的方法,使用 ...