深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。
一、类的生命周期:
类从加载到内存,直至从内存中卸载。整个生命周期如下图:
其中,加载、验证、准备、初始化、和卸载这5个阶段的顺序是确定的。
二、类加载的时机:
Java并没有规定什么时候对类进行加载,但是规定了有且只有5中情况,要对类进行加载:
- new实例化对象时、读取或者设置类的静态字段时,以及调用一个类的静态方法时;
- 使用java.lang.reflect包的方法,对类进行反射调用时;
- 初始化一个类,但是其父类还没有初始化时;
- 虚拟机启动时,要执行的主类;
- 动态语言支持时,java.lang.invoke.MethodHandle实例
三、类加载的时机
1. 加载
加载阶段主要完成3件事:
- 通过一个类的全限定名获取定义此类的二进制字节流(Class文件、zip包、网络、运行时计算)
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 生成一个java.lang.Class对象(未规定该对象的具体存放位置,HotSpot虚拟机将Class对象存放在方法区中),作为方法区这个类的各种数据的访问入口
2. 验证
连接阶段的第一步。
- 文件格式验证 : 字节流是否符合Class文件格式
- 元数据验证 : 类的元数据进行语义验证
- 字节码验证 :
- 符号引用验证 :
3. 准备
连接阶段的第二步。
为类变量分配内存,并设置类变量的初始值(一般为0,final常量会直接赋值)。
4. 解析
连接阶段的第三步。
虚拟机将常量池内的符号引用替换为直接引用的过程。
5. 初始化
对类变量进行初始化,涉及到类变量的初始化顺序。
四、类加载器
“通过一个类的全限定名来获取描述此类的二进制字节流”,实现这个动作的代码块称为“类加载器”。
1. 类与类加载器
对于任意一个类,都由加载它的类加载器和这个类本身一同确立其唯一性。
类与类是否相等:Class对象的equals()方法,isAssignableForm()方法,isInstance()方法,instanceof关键字判定
类加载器的种类:
Java虚拟机角度:启动类加载器(Bootstrap ClassLoader)、所有其他的类加载器;
Java开发人员角度:启动类加载器、扩展类加载器、应用程序类加载器;
2. 双亲委派模型
要求:除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。
工作流程:如果一个类加载器收到了类加载的请求,首先把这个请求委派给父类去完成,最终传递给启动类加载器。只有当父类加载器无法完成这个请求时,子加载器才会尝试自己去加载。
3. 破坏双亲委派模型
双亲委派模型经历了3次被“破坏”。
第一次,jdk1.2之前,必须覆盖loadClass()方法,书写不规范导致不符合双亲委派模型。因此jdk1.2之后,覆盖findClass()方法即可。
第二次,父类加载器请求子类去完成类加载。
第三次,代码热替换、模块热部署等会出现在平级的类加载器中进行加载。
深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制的更多相关文章
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- 深入理解Java内存模型中的虚拟机栈
深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...
- 《Thinking In Java》阅读笔记
<Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- java中的自动拆装箱与缓存(Java核心技术阅读笔记)
最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...
- JVM虚拟机内存溢出垃圾收集及类加载机制总结
1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...
- JVM学习笔记(四):类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...
- Java程序员的必备知识-类加载机制详解
类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
随机推荐
- MySQL ZIP Archive 5.7.17 安装方法
1.下载 2.解压缩 3.创建/修改配置文件 在MySQL安装目录下,新建my.ini,内容如下参考 [mysql] # 设置mysql客户端默认字符集 default-character-set=u ...
- javaweb学习1——加密
声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...
- JavaWeb项目学习教程(2) 系统数据库设计
最开始本来想写一个管理系统,因为考虑到期末来临,我女朋友就可以看着教程然后学一些东西,然后可以自己慢慢手敲代码.但无奈自己也太懒,两个月过后,我才开始继续写这个博客,而现在我都已经开学了.不过博客还是 ...
- 大牛都是这样写测试用例的,你get到了嘛?
1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...
- MFC常用操作
目录: 1.文件操作 1.1.获取文件大小 2.路径操作 2.1.创建多级目录 1.文件操作 1.1.获取文件大小 // 获取文件大小 ULONGLONG size = ; // 文件大小 CFile ...
- nodejs 中 module.exports 和 exports 的区别
1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...
- LIFI热火下的VLC基本链路、标准及发展问题
和白炽及荧光灯相比,白光发光二极管(LED)具有寿命长.光效高.功耗低.无辐射.安全性好.可靠性高等特点,被称为"绿色照明"并得到迅猛发展.白光LED在未来市场极具竞争力.世界范围 ...
- 感谢Thunder
感谢Thunder团队中的每一位成员. 组长王航认真负责,是一个合格优秀的领导者与伙伴,老师布置的任务都会及时分配给每个人,对待每一项任务都认真严谨负责,了解每个成员的优势及强项. 成员李传康.宋雨. ...
- 20135234mqy 实验四
北京电子科技学院(BESTI) 实 验 报 告 课程:java程序设计 班级:1352 姓名:mqy 学号:20135234 成绩: 指导教师:娄嘉鹏 ...
- 使用python快速搭建web服务器
命令:python -m SimpleHTTPServer 8088 参考:https://www.cnblogs.com/harry-xiaojun/p/6739003.html https://w ...