深入理解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. ... 
随机推荐
- centos6.5部署gitlab
			安装过程参考: https://www.cnblogs.com/wenwei-blog/p/5861450.html https://ehlxr.me/2016/07/31/CentOS-%E7%B3 ... 
- pymysql模块使用教程
			一.操作数据库模板 pymysql是Python中操作mysql的模块,(使用方法几乎和MySQLdb相同,但是在Python3中,mysqldb这个库已经不能继续使用了) 下载安装方法: 方法一. ... 
- MYSQL创建表的约束条件(可选)
			一.常用的一些约束条件 一.创建表的完整语法1.创建表的万能模板:create table 库名.表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型 ... 
- 禁用AxWebBrowser右键菜单
			出处:http://stackoverflow.com/questions/41781647/disabling-the-axwebbrowser-context-menu-vb-net 通过底层消息 ... 
- zabbix-agent报错:zabbix_agentd [5922]: cannot open log: cannot create semaphore set: [28] No space left on device
			起因: 新添加完自定义监控项后重启zabbix-agent时失败,查看/var/log/zabbix/zabbix-agentd.log 发现系统提示zabbix共享内存报错 zabbix_agent ... 
- AssetBundle一些问题
			AssetBundle划分过细的问题,比如每个资源都是AssetBundle. 加载IO次数过多,从而增大了硬件设备耗能和发热的压力: Unity 5.3 ~ 5.5 版本中,Android平台上在不 ... 
- python3安装与环境配置和pip的基本使用
			本文环境 系统: Windows10 Python版本: 3.6 安装 python安装包下载 可以选择安装版和解压版 安装版一键安装, 安装过程注意选择安装位置, xx To Path选项(勾选), ... 
- RabbitMQ入门:Hello RabbitMQ 代码实例
			在之前的一篇博客RabbitMQ入门:认识并安装RabbitMQ(以Windows系统为例)中,我们安装了RabbitMQ并且对其也有的初步的认识,今天就来写个入门小例子来加深概念理解并了解代码怎么实 ... 
- MAVEN项目导入src/test/java项目报错
			转载博客:https://blog.csdn.net/gengjianchun/article/details/78679036 https://blog.csdn.net/jsloveyou/ ... 
- 08-matplotlib-颜色与样式
			import numpy as np import matplotlib.pyplot as plt ''' 颜色: - 八种内置默认颜色, 缩写 b :blue g :green r :red c ... 
