JVM之类加载过程
# 类的生命周期
1. 加载 loading
2. 验证 verification
3. 准备 preparation
4. 解析 resoluation
5. 初始化 initialization
6. 使用 using
7. 卸载 unloading
# 加载
Step1 通过类的全限定名获取类的二进制字节流
主要方式:
通过zip, jar, ear, war格式获取
通过网络获取
运行时动态生成, 动态代理技术, Proxy类中通过ProxyGenerator.generateProxyClass方法来为特定接口生成代理类的二进制字节流
由jsp文件产生class类
从数据库获取
注意: 开发人员实现自定义类加载器来控制字节流的获取方式(即重写loadclass方法)
数组类的加载方式与一般类的加载方式不同:
数组类本身不同个类加载器创建, 由JVM直接创建
数组类与类加载器密切相关, 数组类的元素类型最终也是由类加载器创建
Step2 将类的二进制字节流存储在方法区之中, 数据结构由JVM实现
Step3 在内存中实例化一个Java.lang.Class类的对象
Class类的对象不一定在Java堆中, 对于HotSpot虚拟机将其存储在方法区内
加载阶段与连接阶段(验证 准备 解析)是交叉进行的
# 验证
由于字节码文件不一定由Java源码编译而成, 可以通过各种途径获取, 这样一来就可能存在有害的字节码, 若JVM载入了有害的字节码将会导致JVM崩溃, 所以验证就是为了确保字节码文件的字节流中包含的信息是否符合当前JVM的要求, 且不会危害虚拟机自身的安全.
4个阶段:
1. 验证文件格式: 验证字节流是否符合字节码文件格式的规范
2. 验证元数据: 是否符合Java语言规范
3. 验证字节码: 通过数据流 控制流分析程序的语义和逻辑
4. 验证符号引用 发生在解析阶段
# 准备
为类变量(被static修饰)分配内存并设置类变量初始值, 内存会被分配到方法区内
举例:
public static int value = 123;
类变量:
类变量在准备阶段初始值为0, 将value赋值为123的动作发生在初始化阶段
常量:
常量在编译时javac将会为value生成ConstantValue属性, 并且在准备阶段将value赋值为123
实例变量:
实例变量将在对象实例化时随对象一起分配到Java堆中
# 解析
JVM将常量池内的符号引用替换为直接引用的过程
4种解析过程:
1. 类或接口的解析
2. 字段解析
3. 类方法解析
4, 接口方法解析
# 初始化
执行类中定义的Java程序代码, static语句块在这步被执行
## 类初始化阶段的触发时机
对类主动引用时, 将会触发初始化
1. 使用new实例化对象
2. 操作类静态字段(常量除外)或静态方法时
3. 反射调用类时
4. 初始化子类时, 若其父类未被初始化, 则会先触发父类的初始化
5. JVM启动时, 会先初始化主类(包含main方法的类)
6. JDK7动态语言...
对类被动引用时, 不会触发初始化
1. 通过子类引用父类的静态字段, 只会初始化父类, 而不会初始化子类
2. 通过数组定义引用类, 不会触发类的初始化
```
SuperClass[] sc = new SuperClass[10];
```
3. 读取常量时, 不会触发定义常量的类的初始化
说明: 常量在编译阶段就会存储到调用类的常量池中, 本质上并没有直接引用到定义常量的类
JVM之类加载过程的更多相关文章
- JVM的类加载过程以及双亲委派模型详解
JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...
- 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型
一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...
- JVM虚拟机 类加载过程与类加载器
目录 前言 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 类加载器 三大类加载器 双亲委派模型 概念 为什么要使用双亲委派模型 源码分析 反双亲委派模型 参考 前言 类装载器子系统是 ...
- JVM的类加载过程
每日一句 人到情多情转薄,而今真个不多情. 每日一句 The frog in the well knows nothing of the great ocean. 井底之蛙,不知大海. JVM 的类加 ...
- java jvm虚拟机类加载过程
加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这 ...
- 每日一问:讲讲 JVM 的类加载机制
前面给大家讲解了 Java 虚拟的内存结构 以及 Java 虚拟机的垃圾回收机制,我们更加明白了 Java 的内存管理机制,今天我们来讲讲 Java 虚拟机的另外一个高频考点:类加载机制. JVM 的 ...
- JVM类加载过程学习总结
JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...
- jvm学习002 虚拟机类加载过程以及主动引用和被动引用
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为 ...
- 【深入Java虚拟机】一 JVM类加载过程
首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...
随机推荐
- Redis数据结构之整数集合-intset
当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis会使用整数集合(intset)来存储集合元素. intset是紧凑的数组结构,同时支持16位.32位和64位整数. 结构 struc ...
- Selenium3 + Python3自动化测试系列七——多窗口切换
多窗口切换 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作. WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切 ...
- mongo之find结果对象map实例处理
find 找到结果对象列表 res = await SS_StudentsLeaveTask.find(filter=_filter) self.resData = map(lambda x: str ...
- 使用Kettle的命名参数动态执行作业
关于如何根据传入的不同参数,达到动态运行作业的目的,这里不介绍.只提供一个思路,就是不同的调度进程调度同一个Kettle文件时,传入了不同的参数,从而得到不同的数据. 如下图所示: 1. 先设置参数名 ...
- BOM的构成
1.DOM 和 BOM 的区别 DOM:文档对象模型,把[文档]当做一个[对象]来看待,DOM的顶级对象是document 主要学习的是操作页面元素,DOM 是 W3C 的标准规范 BOM:浏览器对象 ...
- C/C++中的return和exit
return:只是退出函数; ~是关键字. exit:是退出进程; ~是函数名. 整理自:https://www.cnblogs.com/cxchanpin/p/6927025.html
- [转]PHP base64_encode 在URL地址参数编码上使用
因为我使用公钥,使用php的 openssl 加密之后的资料 base64_encode()字符串,然后放入请求 url 中当作参数,urlencode(base64_encode()),然后用 ur ...
- js 404页面跳转
非原创 <script type="text/javascript"> var num = 5; function redirect() { num--; docume ...
- js正则判断实现18位数字
js实现18位数字 var stuCardReg = /^[0-9]{18}/; var stuCard = $('.inp).val();//获取input框中的数值 if (!stuCardReg ...
- FTT & NTT & 分治FFT
FFT study from: http://www.orchidany.cf/2019/02/19/FFT1/ https://www.cnblogs.com/zwfymqz/p/8244902.h ...