《剑指JVM》——第19章7——类的使用与卸载——类装载子系统7

🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了《剑指JVM》——第19章7——类的使用与卸载——类装载子系统7🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


🔥 《剑指JVM》序言-CSDN博客

🔥 《剑指JVM》全书-CSDN博客


🌈章节引出

前一篇章:

🌈章节速览


一、类的使用

        任何一个类在使用之前都必须经历过完整的加载、链接和初始化3个步骤【不一定,因为初始化是有条件的】。一旦一个类成功经历这3个步骤之后,便“万事俱备,只欠东风”,就等着开发者使用了。开发人员可以在程序中访问和调用它的静态类成员信息(比如静态字段、静态方法等),或者使用 new关键字创建对象实例。 


二、类的卸载

0.概述

和前面讲过对象的生命周期类似,对象在使用完以后会被垃圾收集器回收,那么对应的类、类的加载器、类在使用完成以后,也有可能被卸载掉。在了解类的卸载之前,需要先厘清类、类的Class对象和类的实例之间的引用关系。



1.类、类的加载器、类的Class对象、类的实例之间的引用关系

(1)类加载器和类的 Class 对象之间的关系。


        在类加载器的内部实现中,用一个Java 集合来存放所加载类的引用
        另外,一个Class对像总是会引用他的类加载器。调用Class 对象的 getClassLoader0方法,就能获得它的类加载器。由此可见,代表某个类的 Class 对象与该类的类加载器之间为双向关联关系】

(2)类、类的 Class 对象、类的实例对象之间的关系。

    一个类的实例总是引用代表这个类的Class 对象。 Object 类中定义了 getClass() 方法,这个方法返回代表实例所属类的Class对象的引用。此外,所有的Java类都有一个静态属性class,它引用代表这个类的 Class 对象。


2.类的生命周期

当类被加载、链接和初始化后,它的生命周期就开始了,当代表类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期【前面的GC知识】,类在方法区内的数据也会被卸载,从而结束类的生命周期,一个类何时结束生命周期,取决于代表它的Class 对象何时结束生命周期。
 

3.案例[暂略]


        自定义一个类加载器 MyClassLoader 加载自定义类 Order,那么就可以通过 Order 的 Class3.案例对象获取到对应的类加载器,再通过Order类的实例对象获取到类Class对象,如代码:
 

4.类的卸载


通过上面的案例可以知道当类对象没有引用时,可能会产生类的卸载,类的卸载需如下三个条件。
(1)该类所有的实例已经被回收。
(2)加载该类的类加载器的实例已经被回收。
(3)该类对应的 Class 对象没有任何对方被引用。


三、回顾:方法区的垃圾回收

        方法区的垃圾收集主要回收两部分内容,分别是常量池中废弃的常量不再使用的类。HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收。
JVM 判定一个常量是否“废弃”还相对简单,而要判定一个类是否属于“不再被使用的类”的条件就比较苛刻了,需要同时满足下面三个条件:

        (1)该类所有的实例都已经被回收。也就是Java堆中不存在该类及其任何派生子类的实例。

        (2)加载该类的类加载器已经被回收。这个条件除非是经过精心设计的可替换类加载器的场景,如 OSGi、JSP的重加载等,否则通常是很难达成的。
        (3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。


        上述三个条件并不是JVM 卸载无用类的必要条件,JVM可以卸载类也可以不卸载类,不会像对象那样没有引用就肯定回收。



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈JAVA面试八股文系列专栏           关注走一波💕💕

🌈🌈JAVA基础试题集精讲                  关注走一波💕💕   

🌈🌈代码随想录精讲200题                  关注走一波💕💕


总栏

🌈🌈JAVA基础要夯牢                         关注走一波💕💕  

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈数据结构与算法                           ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕         



📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值