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.什么时候会为变量赋默 ...
随机推荐
- 用Cython加速Python代码
安装Cython pip install Cython 如何使用 要在我们的笔记本中使用Cython,我们将使用IPython magic命令.Magic命令以百分号开始,并提供一些额外的功能,这些功 ...
- 通过start.spring.io生成的springboot项目,导入IDE后POM第一行报错
通过problem控制台查看,显示unknown 尝试降低springboot版本,问题没了,应该是与maven jdk等版本冲突导致 这里JDK 1.8 mave 3.6.1 降低springb ...
- 文件上传到ftp服务工具类
直接引用此java工具类就好 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...
- Mybatis中$和#取数据的区别
Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...
- 关于print()里面的sep和end参数的使用
print('hello', 'world') #默认用空格隔开 #hello world print('hello', 'world', sep='wuli') #sep=''可以用来设置连接的字符 ...
- Laravel 开发环境搭建
本人使用的是Laravel5.5版本,需要PHP7支持,所以安装的环境是Apache2.php7.0.mysql5.7,系统为ubuntu14.04LTS(14以下的版本对php7支持不够),主要参考 ...
- Python pillow库安装报错
报错信息: D:\pythontest\duanxinhongzha>pip3 install pillowCollecting pillow Could not find a version ...
- NX二次开发-UFUN获取当前所在的模块UF_ask_application_module
NX9+VS2012 #include <uf.h> #include <NXOpen/UI.hxx> #include <NXOpen/MenuBar_MenuBarM ...
- Android中滑屏实现----触摸滑屏以及Scroller类详解 .
转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一: 关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问 ...
- Try running RemoteDll as Administrator
在使用RemoteDll注入动态库的时候发现注入有的动态库会提示下面的错误, LoadLibrary on remote process [1968 - Explorer.exe] failed. T ...