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.什么时候会为变量赋默 ...
随机推荐
- 如何设置linux启动过程中的停止阶段
设置方法: 1 启动过程中点击“e”键(fedora)或者"tab"(centOS)键进入目标启动项的命令行参数下,移除initrd所在行末尾的"quiet" ...
- idea plugin 进度条
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Switching Env") { @Ove ...
- python面试题之多线程好吗?列举一些让Python代码以并行方式运行的方法
答案 Python并不支持真正意义上的多线程.Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意.Python中有一个被称为Global Interpret ...
- hdu6341 /// 模拟 DFS+剪枝
题目大意: 将16行16列的矩阵分成四行四列共16块 矩阵的初始状态每行及每列都不会出现重复的元素 给定一个已旋转过某些块的矩阵 判断其是由初始状态最少经过几次旋转得到的 DFS枚举16个块的旋转方式 ...
- zabbix--监控的组件和进程介绍
上图是zabbix的架构,zabbix proxy(代理),可以减小IO并发. zabbix web GUI是用php写的画图工具,从数据库抓取数据. zabbix database zabbix获取 ...
- 2018-2-13-win10-uwp-入门
title author date CreateTime categories win10 uwp 入门 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...
- 2019-7-15-WPF-测试触摸设备发送触摸按下和抬起不成对
title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 lindexi 2019-7-15 9:3:51 +0800 2019-0 ...
- 在KVM虚拟化中如何实现vlan
换了好几个浏览器,都不能复制文字上来,不知道为什么.就发我的笔记截图吧
- Razor页面之添加TagHelper
1.右键项目-----添加------新建项 2.创建Razor试图导入 (Razor View Imports) 3.在创建的_ViewImports.cshtml中添加 @AddTagHelpe ...
- No parser no filepath given问题解决
关于 vue 项目 run dev 的时候,控制台警告: No parser and no filepath given, using 'babylon' the parser now but thi ...