类的命名空间与卸载详解及jvisualvm使用
类的命名空间详解:
在上一次【https://www.cnblogs.com/webor2006/p/9108301.html】最后实验中有一个违背咱们理解的,这里回顾一下:


也就是说,"某一个类对应的class文件只能被加载一次",这是有一个大前提的,该前提就是"该类加载器必须是在同一个命名空间里",如果在不同的命名空间同一个类的字节码文件是可以被加载多次的,那带着命名空间的概念咱们再来解析一下上面的输出:
在要加载的MyTest1字节码文件从编译工程中删除之后,由于都会由咱们自己所编写的自定义类加载器MyTest16所加载,而由于是两个不同类加载器,虽说类加载器的类型都属于自定义的MyTest16,这里可以增加一个日志来直观的体会一下:

编译运行:

那如果不将工程中编译的MyTest1字节码文件删掉其运行结果又是:

搞清楚了命名空间概念之后,下面继续基于该程序进行改造,前提还是MyTest1的字节码文件已经从工程中被删掉了,改造如下:


那结果是什么呢?

其实这个细节在loadClass()方法中已经有说明:

另外还需要注意一个细节,这里先回顾一下类加载器的层次体系:

虽说图中表达的是一种树形的结构,其实是一种包含关系,子加载器包含父加载器的一个引用,其实这种引用关系还可以进一步延伸,以咱们的这个例子为例:

下面再来定义一个类加载器:

重新编译,此时MyTest1的字节码文件已经在工程当中了,运行:

那接下来将MyTest1的字节码文件从工程中删掉,那这次结果又会有啥变化呢?

好,继续再修改:

编译运行,此时MyTest1的字节码文件存于工程当中了:

那如果将MyTest1的字节码文件给删掉其结果又会如何呢?

以上通过这么详细的实验是不是对类的双亲委托以及命名空间的概念有了非常深刻的认识。
类的卸载详解与jvisualvm使用:
- 当MySample类被加载、连接和初始化后,它的生命周期就开始了。当代表MySample类的Class对象不再被引用,既不可触及时,Class对象就会结束生命周期,MySample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。
- 一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。
- 由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。前面已经介绍过,Java虚拟机自带的类加载器包括根类加载器、扩展类加载器和系统类加载器。Java虚拟机本身会始终引用这些类加载器。而这些类加载器则会始终引用它们所加载类的类的Class对象,因此这些Class对象始终是可触及的。【言外之意就是说三大系统类加载器加载的Class对象是无法被卸载的】
- 由用户自定义的类加载器所加载的类是可以被卸载的。【如咱们自定义的MyTest16加载器所加载的类】
- 运行以上程序时,Sample类由loader1加载。在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器。调用Class对象的getClassLoader()方法,就能获取它的类加载器,由此可见,代表Sample类的Class实例与loader1之间为双向关联关系。一个类的实例总是引用代表这个类的Class对象,在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。此外,所有的Java类都有一个静态属性class,它引用代表这个类的Class对象。
上面一大堆的理论有木有实验能清晰的看到类被卸载的呢?下面就来实验一下:


那如何能看到类的卸载信息呢?这时就需要加一个JVM的运行参数"-XX:+TraceClassUnloading",如下:

再次运行:

那如何来模拟呢,看下面:

那:

试试不加:

那如果就想不加那三断置null的语句也能看到类被卸载的信息,如何搞呢?

其实还可以利用jvisualvm小工具也能查看到类被卸载的记录,代码还是先还原,如下:

先运行jvisualvm:


然后再启动咱们的测试程序:

此时进程信息就会出现在jvisualvm工具之上,如下:

然后选择它打开具体的监视信息:


关于jvisualvm的其它功能待以后学习慢慢挖掘~
类的命名空间与卸载详解及jvisualvm使用的更多相关文章
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- StringUtils类API及使用方法详解
StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- Object类、包装类、内部类详解
1.Object类 1.概念: 1.1 所有类在创建时都默认继承了java.lang.Object 1.2 所有类对象都可以声明为类对象的引用 Object ob1=new String(); Obj ...
- Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...
- java中ReentrantLock类的详细介绍(详解)
博主如果看到请联系小白,小白记不清地址了 简介 ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字 ...
- mybatis中的mapper接口文件以及example类的实例函数以及详解
##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...
- [Java]Java类和对象内存分配详解
描述 代码说明: 一.当Person p1 = new Person();第一次被调用时需要做两件事: 1.先判断类加载器是否加载过Person类,如果没有则加载到Person类型到方法区 2.在堆中 ...
随机推荐
- vscode Settings Sync 插件的详细介绍
参考链接:https://www.jianshu.com/p/dbbdc635f8e1
- ahk实现git图床自动预览以及转换markdown格式
ahk实现git图床自动预览以及转换markdown格式 软件地址 https://gitee.com/layty/pic/tree/master/app 软件功能: 检测剪切板,如果剪切板有非文本信 ...
- table固定头部,tbody内容滚动
直觉的感受是修改thead与tbody,尝试了以下几种方法,但均告失败. 1. 将tbody设置为块状元素,然后设置表格的高度与溢出: 1. 将thead设置为绝对定位,然后设置表格的高度与溢出: 1 ...
- Mac查看端口号是否被占用及释放
1.查看使用端口进程 lsof -i: 端口号 2.释放进程 kill 你的PID 3.再次执行第一步,是否无进程占用 lsof -i: 端口号
- HTTPS 简单学习
1. HTTP缺点 使用明文通信,内容可能会被窃听: 通信加密:使用SSL和TLS: 内容加密: 不验证通信方的身份,因此可能会遭到伪装: SSL提供加密和证书: 无法证明报文的完整性,因此会遭到修改 ...
- c++:论如何成功把自己搞懵【二叉树特辑①】(不定期更新)
并不正经的前言 以前我这个小白看OI的书,老觉得有些东西很高端(看不懂的自然就很高端[滑稽]):什么栈啊,位运算啊,二叉树啊.有些东西我学了之后也很迷糊(真的不是因为傻?),做题的时候总是可以把自己搞 ...
- PHP接收前端传值各种情况整理
PHP接收前端传值各种情况整理 服务端代码: header('Access-Control-Allow-Origin:*'); var_dump($_POST); exit; 情况 1) 传null ...
- 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案
本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...
- 二、python数据类型、字符编码、文件处理
一. 前言 1. 什么是数据: x = 10,10就是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的, 不同的状态就应该用不同类型的数据去表示 3. 数据类型 数字(整型.长整型 ...
- RBAC授权
RBAC RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 Kubernetes API 动态配置策略,要启用RBAC,需要在 api ...