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.什么时候会为变量赋默 ...
随机推荐
- JDK8新特性之Optional
Optional是什么 java.util.Optional Jdk8提供Optional,一个可以包含null值的容器对象,可以用来代替xx != null的判断. Optional常用方法 of ...
- Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例
前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...
- js 实用封装 点击按钮复制到剪贴板
封装剪贴板: function Copy(str) { var save = function (e) { //设置需要复制模板的内容 e.clipboardData.setData('text/pl ...
- Python自学:第五章 动手试一试 4-3
# -*- coding: GBK -*- numbers = ['] for number in numbers: print(number) 输出为: 1 2 3 4 5 6 7 8 9 10 1 ...
- Ruby 命令行选项
Ruby 命令行选项 Ruby 一般是从命令行运行,方式如下: $ ruby [ options ] [.] [ programfile ] [ arguments ... ] 解释器可以通过下列选项 ...
- alert样式优化
//alert样式优化 function alert(msg, mode) { //mode为空,即只有一个确认按钮,mode为1时有确认和取消两个按钮 msg = msg || ''; mode = ...
- Java高新技术第三篇:注解的使用
我们知道注解是在JDK1.5引入的,可能有的人没有用过注解,所以感觉注解这个东西没有什么用,但是深入了解注解,对以后学习框架有所帮助的,后面提到的JavaWeb的框架中很多都是基于注解的技术, 其实注 ...
- SCP-bzoj-1000
项目编号:bzoj-1000 项目等级:Keter 项目描述: 鉴于该项目的奇特性质,任何拥有Administrator以下权限者均不予查看项目描述.如有违反,将导致AwD成功突破Site bzoj收 ...
- 思维题——牛客多校第六场D
这题的不能用二分做,因为不满足单调性的 可以用multiset做 #include<bits/stdc++.h> #define ll long long #define rep(i,a, ...
- 一次Spring Transactional嵌套事务使用不同的rollbackFor的分析
起因: 项目期间由于一次异常回滚问题,发现自己在事务知识方面知识的遗漏,趁着这次机会,做了几次rollbackFor的测试. 测试: 现在有两个事务,事务oute包含事务Inner.事务A回滚规则 ...