JVM 专题五:类加载子系统(三)补充内容
2024-08-31 10:01:32
3. 补充内容
3.1 在jvm中表示两个class对象是否为同一个类的两个必要条件
- 类的完整类名必须一致,包括包名。
- 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同
| 换句话说,在jvm中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的.
| 自定义的java.lang.String类和核心库中的java.lang.String,前者的ClassLoader是系统类加载器,后者的ClassLoader是引导类加载器,所以这两个String不是同一个类
3.2 对类加载器的引用
JVM必须知道一个类型是由启动类加载器加载的还是由用户类加载器加载的。如果一个类型由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM需要保证两个类型的类加载器是相同的。
3.3 Java程序对类的使用方式分为主动使用和被动使用
| 主动使用和被动使用的区别就是是否会导致类的初始化
3.3.1 主动使用,分为七种情况
- 创建类的实例
- 访问某个类或接口的静态变量,或者对静态变量赋值
- 调用类的静态方法
- 反射,比如Class.forName(com.dsh.jvm.xxx)
- 初始化一个类的子类
- Java虚拟机启动时被标明为启动类的类
- JDK7 开始提供的动态语言支持:
java.lang.invoke.MethodHandle实例的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic句柄对应的类没有初始化,则初始化
| 除了以上七种情况,其他使用java类的方式都被看作是对类的被动使用,都不会导致类的初始化。
最新文章
- 要当好JavaScript程序员:5个debug技巧
- Android使用SAX解析XML(4)
- JPA学习(6)JPQL
- mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
- [Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost') does not exist
- c#中queue的用法
- Redis笔记1-redis的搭建和使用
- ionic3 Loading组件的用法
- Winform系列——好看的DataGridView折叠控件
- C语言函数strstr
- asp.net前台页面与后台之间传值,
- task_payment_byonlinedown
- 图文转化(Alpha)版使用说明
- dsp6657的helloworld例程测试-第一篇
- 【RF库测试】Exit For Loop 相关
- 基于TSUNG对MQTT进行压力测试-基础概念温习
- Alpha冲刺 - (8/10)
- uGUI Anchor
- angular-messages.js信息验证的使用
- 2.5 进程控制之wait函数
热门文章
- CentOS7——初始化
- CSS中的百分比(%)如何使用???
- UI 小白设计常用的Website
- Eplan PLC连接点模块为什么不显示“路径功能文本”,已解决
- selenium(2)-selenium针对浏览器的操作有哪些
- Flink Table Api &; SQL 初体验,Blink的使用
- 团队进行Alpha冲刺--冲刺总结
- 初识Java Java基础知识
- 新版MySQL开始使用时遇到的问题(时区、权限):
- Exception in thread ";main"; java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D