李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(六)--类加载器深入解析及重要特性剖析
Leefs
2019-11-16 PM
3224℃
1条
# 类加载器深入解析及重要特性剖析 ### 前言 今天对之前学习的JVM一些知识点进行一下总结,整理的有点乱,都是一些需要记忆的知识点,大家没事可以多看看。 ### 一、类的生命周期 ![JVM类加载器深入解析及重要特性剖析01.png][1] 该图描述了整个类完整的生命周期:**从磁盘上开始加载-->进入到内存当中-->销毁**。 ![JVM类加载器深入解析及重要特性剖析02.png][2] `
:`表示对类的静态变量的初始化 `
:`表示对实例变量的初始化 上图包含类的执行过程: 加载-->连接-->初始化-->生成对象-->为对象中的成员变量赋予默认值-->赋予指定的值 ### 二、类的加载 + 1.类的加载的最终产品是位于内存中的Class对象 + 2.Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 Class对象是整个反射的一个入口,它向一面镜子一样能够洞悉出来在方法区内,或者编写的类文件当中的所有信息,包括成员变量、包括方法。 ### 三、有两种类型的类加载器 **Java虚拟机自带的加载器** + 1.根类加载器(Bootstrap),也叫启动类加载器 + 2.扩展类加载器(Extension) + 3.系统(应用)类加载器(System) **用户自定义的类加载器** + 1.`java.lang.ClassLoader`的子类 + 2.用户可以定制类的加载方法 **类加载器并不需要等到某个类被“首次主动使用”时再加载它** JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在**程序首次主动**使用该类时才报告错误(`LinkageError`错误) 如果这个类一直没有被程序主动使用,那么**类加载器就不会报告错误** ### 四、类的验证 + 1.类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。 + 2.类的验证的内容 + 类文件的结构检查 + 语义检查 + 字节码验证 + 二进制兼容性的验证 ![JVM类加载器深入解析及重要特性剖析03.png][3] ![JVM类加载器深入解析及重要特性剖析04.png][4] ![JVM类加载器深入解析及重要特性剖析05.png][5] ### 五、类的初始化步骤 + 1.假如这个类还没有被加载和连接,那就先进行加载和连接 + 2.假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类 + 3.加入类中存在初始化语句,那就依次执行这些初始化语句 ### 六、类的初始化时机 **主动使用** + 1.创建类的实例 + 2.访问某个类或接口的静态变量,或者对该静态变量赋值 + 3.调用类的静态方法 + 4.反射(如`Class.forName("com.test.Test")`) + 5.初始化一个类的子类 + 6.Java虚拟机启动时被标明为启动类的类(Java Test) + 7.`JDK1.7`开始提供的动态语言支持: `java.lang.invoke.MethodHandle`实例的解析结果`REF_getStatic`,`REF_putStatic`,`REF_invokeStatic`句柄对应的类没有初始化,则初始化 + **除了上述七种情形,其他使用Java类的方式都被看作是被动使用,不会导致类的初始化** ![JVM类加载器深入解析及重要特性剖析06.png][6] + 只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用 + 调用`ClassLoader`类的`loadClass`方法加载一个类,并不是对类的主动使用,不会导致类的初始化。 ### 七、类加载器 ![JVM类加载器深入解析及重要特性剖析07.png][7] ### 类加载器 ![JVM类加载器深入解析及重要特性剖析08.png][8] **类加载器的层次关系** ![JVM类加载器深入解析及重要特性剖析09.png][9] [1]: https://lilinchao.com/usr/uploads/2019/11/428287962.png [2]: https://lilinchao.com/usr/uploads/2019/11/442315026.png [3]: https://lilinchao.com/usr/uploads/2019/11/2928380191.png [4]: https://lilinchao.com/usr/uploads/2019/11/2217302012.png [5]: https://lilinchao.com/usr/uploads/2019/11/3050207117.png [6]: https://lilinchao.com/usr/uploads/2019/11/3897035974.png [7]: https://lilinchao.com/usr/uploads/2019/11/1829375299.png [8]: https://lilinchao.com/usr/uploads/2019/11/2819330045.png [9]: https://lilinchao.com/usr/uploads/2019/11/1440066903.png
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/178.html
上一篇
JVM学习(五)--类加载器准备阶段和初始化阶段的重要意义分析
下一篇
JVM学习(七)-- 初始化对于类与接口的异同深入解析
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Nacos
Scala
CentOS
随笔
Hadoop
Tomcat
Java阻塞队列
递归
持有对象
DataX
数据结构
Beego
Java工具类
查找
Filter
数学
Hive
前端
RSA加解密
设计模式
Http
正则表达式
Shiro
SpringCloudAlibaba
国产数据库改造
Java
Hbase
Sentinel
SpringBoot
排序
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭