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.什么时候会为变量赋默 ...
随机推荐
- 《提高c++性能的编程技术》读书笔记
一个程序的执行效率是取决于改程序翻译成汇编语言之后的执行的机器指令的条数.而每一个机器指令的执行的周期是一定的.C语言和C++都是高于汇编语言的高级语言,其中,C语言源代码与其相应的机器指不是完全同一 ...
- 笔记43 Spring Security简介
基于Spittr应用 一.Spring Security简介 Spring Security是为基于Spring的应用程序提供声明式安全保护的安全 性框架.Spring Security提供了完整的安 ...
- nodejs 在MYSQL 数据库中插入和查询数据
插入前的数据库: 插入后的数据库: 输出结果: demo var mysql = require('mysql'); var connection = mysql.createConnection({ ...
- 微信小程序学习之navigate(1)navigateTo方法与navigateBack方法对于page生命周期不同的触发影响
小程序的每个页面都有一些生命周期,每个生命周期由分别有着不同的生命周期钩子函数.而我们的业务逻辑写在这些生命周期的钩子函数中,那么弄清楚那种情形下会触发那些生命周期钩子函数就非常重要了 先上一段代码 ...
- Burnside引理&Pólya定理
Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...
- winfrom设置webBrowser框架默认的IE内核版本
要实现设置webBrowser框架默认的IE内核版本的功能需要三个方法 1:修改注册表信息来兼容当前程序 /// <summary> /// 修改注册表信息来兼容当前程序 /// /// ...
- 开放应用模型(OAM):全球首个云原生应用标准定义与架构模型
Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长.但同时我们也关注到,Kubernetes 的核心 API 资源比如 ...
- NX二次开发-UFUN工程图初始化视图信息UF_DRAW_initialize_view_info
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...
- NX二次开发-UFUN添加工程图投影视图UF_DRAW_add_orthographic_view
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...
- post请求传文件
public static JSONObject doFormDataPost(File file, String sURL) throws IOException { HttpClient cont ...