jvm学习笔记:类加载过程
类加载器子系统
类加载器的作用是加载class文件到内存
加载阶段->链接阶段->初始化阶段
ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断
加载的类信息存放在方法区的一个区域,该区域称为常量池,还存放了字符串字面量、数字常量等
类加载过程
判断类是否加载,已经加载了就开始链接
加载阶段
过程
(1)通过全限类名找到类.class文件,获取文件的字节流
(2)将字节流按照静态类的数据格式转换成存储在方法区的运行时数据结构
(3)为该类生成唯一的java.lang.Class的对象,并在堆中分配内存,作为方法调用和属性的接口
找到.class文件->获取字节流->转换成运行时数据结构->内存中生成Class对象
class文件的不同加载方式
(1)从本地文件系统加载
(2)网络加载
(3)压缩包加载,比如jar包、war包
(4)运行时计算生成,动态代理模式下常用
(5)其他文件生成,比如jsp文件
(6)数据库提取
(7)加密文件中获取,比如防反编译的class文件
链接过程
验证(Verify)(检查字节码文件规范)
验证字节流是否符合java虚拟机规范,符合规范就继续链接过程,否则抛出异常
准备(prepare(初始化类变量:分配内存、赋初值为0|null)
为类变量分配内存空间,并赋初值0值(null值)
注意:准备过程只为静态变量赋初值,不会为常量赋初值,因为常量在编译阶段就已经完成了赋值
解析(Resolve)(解析引用)
将符号引用解析成直接引用
符号引用: 用符号来描述引用的目标
直接引用: 直接指向目标的指针、偏移量
初始化过程
初始化
执行构造器方法 cinit
构造器方法
javac编译时会将类的静态变量赋值语句、静态代码块合并成一个构造器方法
(1)构造器方法的指令执行顺序与java代码的语句顺序一致
(2)JVM会保证父类的构造器方法在子类构造器方法之前完成执行
(3)构造器方法只执行静态代码块语句和类变量的赋值,如果源代码中无这两者就不会生成构造器方法
(4)JVM会为构造器方法加线程同步锁,保证每个类只加载一次
例子
private static int num = 1;
static{
num = 2;
number = 20;
}
private static int number=10;
上述特殊情况:number的声明在符值后面,但是jvm依然能初始化,因为在构造器方法之前已经完成了链接阶段的prepare过程,该过程为number符值了0
过程: linking.prepare:number=0->init:number=20, number=10
init阶段的符值是严格按照代码顺序的
jvm学习笔记:类加载过程的更多相关文章
- JVM学习笔记——类加载过程
JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...
- [jvm学习笔记]-类加载过程
JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流 ...
- JVM学习笔记——类加载和字节码技术篇
JVM学习笔记--类加载和字节码技术篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分 我们会分为以下几部分进行介绍: 类文件结构 字节码指令 编译期处理 类 ...
- JVM学习笔记——类加载器与类加载过程
类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- JVM学习笔记——垃圾回收篇
JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
随机推荐
- 简单的Postman,还能玩出花?
Postman是一款我们在工作中使用频率非常高的API调试工具,估计很多童鞋在使用它时也比较粗暴,填好接口地址.参数,直接send就完事了,估计大家要说了,这么简单的东西还能玩出什么花来.今天就和大家 ...
- Java中泛型的详细解析,深入分析泛型的使用方式
泛型的基本概念 泛型: 参数化类型 参数: 定义方法时有形参 调用方法时传递实参 参数化类型: 将类型由原来的具体的类型参数化,类似方法中的变量参数 类型定义成参数形式, 可以称为类型形参 在使用或者 ...
- Azure安装完postgresql遇到:psql: error: could not connect to server: FATAL: no pg_hba.conf entry for host
进入创建好的Azure Database for PostgreSQL server 点击connection security 在Firewall rules中 Add 0.0.0.0-255.2 ...
- 寄生线虫免疫学研究新路径!华中农业大学胡敏团队报道寄生线虫N-糖基化修饰图谱
N-糖基化修饰是真核生物中一种重要的蛋白质翻译后修饰,在许多生物学过程中起着关键作用,包括蛋白质折叠.受体-配体相互作用.免疫应答和疾病发病机制等.近年来,高精度质谱技术的出现促进了糖组和糖蛋白质组的 ...
- [NumPy]文件的保存和加载
如果想看.ipynb文件,那就借一步说话!
- 值得收藏 | 深度剖析 TensorCore 卷积算子实现原理
作者:章晓 | 旷视 MegEngine 架构师 一.前言 2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere).其中和深度学习关系最密切的莫过于性能强劲的第三代的 T ...
- 002 PCI Express体系结构(二)
一.PCI总线的信号定义 PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种 ...
- Liunx搭建Mysql服务器
1:安装从网上下载文件的wget命令[root@master ~]# yum -y install wget 2:下载mysql的repo源[root@master ~]# wget http://r ...
- SQL 练习26
查询 1990 年出生的学生名单 --方式1 SELECT * FROM Student WHERE Sage BETWEEN '1990-01-01' AND '1990-12-31' --方式2 ...
- Thread类中yield方法
Yield方法可以暂停当前正在执行的线程对象,让其他有相同优先级的线程执行.它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂 ...