[jvm学习笔记]-类加载过程
JVM类加载的过程
加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作
加载
在加载阶段,虚拟机需要完成3个事情
1.通过一个类的全限定名获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个代表这个类的 java.lang.class 对象,作为方法区这个类的各种数据的访问入口
相对于类加载过程的其他阶段,一个非数组类(数组类是由jvm虚拟机直接创建的)的加载过程(加载阶段获取类的二进制字节流的动作)是开发人员可控性最强的,因为加载阶段可以使用系统提供的引导类加载器去完成,也可以有开发人员自定义的类加载器去完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的loadClass()函数)。
加载阶段和连接阶段的部分内容是交叉进行的(如一部分字节码文件的验证动作),加载阶段尚未完成,连接阶段可能已经开始,但是这些夹在加载阶段进行之中的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持固定的先后顺序。
验证
验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自己的安全。
java语音本身是相对安全的语音,如果遇到异常代码(指无法通过语法检查的代码),编译器是拒绝编译的,但是所有Class文件并不一定是按照java源码编译来的,甚至可以用十六进制编辑器直接修改产生的Class文件,虚拟机如果不检查输入的字节流,而对其完全信任的话,可能载入了有害的字节流而导致系统崩溃,这是我们无法接受的,所以验证是虚拟机对真身保护的一项重要工作
验证阶段大致上会完成下面4个检验动作:文件格式验证,元数据验证,字节码验证,符号引用验证
1.文件格式验证
第一阶段要验证字节流是否符合Class文件格式规范,并且能被当前版本的虚拟机处理。
2.元数据验证
第二阶段是对字节码描述的信息进行语义化分析,以保证其描述的信息符合java语音规范的要求。
3.字节码验证 第三阶段是整个验证过程中最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的,符合逻辑的。这个阶段会对类的方法体进行校检分析,确保在方法运行的时候不能做出危害虚拟机安全的时间。
4.符号引用验证 最后一个阶段的校检发送在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接阶段的第三个阶段,解析阶段中发生。
准备
准备阶段是正式为类变量分配内存并设置为初始值的阶段(该阶段仅将变量设置为初始值,而并非赋值),这些变量所使用的内存都将在方法区中进行分配,这个时候进行的内存分配的仅包括类变量(static修饰的变量),而不包括实例变量,实例变量将会在对象实例化的时候随着对象一起分配在java堆中。而且这里所说的初始化通常指数据类型的零值。
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。
java会编译(类似编译过程)会把类文件(.java)编译成class文件(.class),但是这个过程中如果A类需要引用B类,由于没有加载入内存执行,所以他并不知道B类的地址,因此用符号代替,即为符号引用。到执行程序时会加载类,相关类会进入内存,因此可以就有了内存地址,A类就可以将符号引用映射带B类地址,就是直接引用了!
初始化
类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段开发人员可以用自定义类加载 器参与之外,其他动作都是有虚拟机主导和控制的,到了初始化阶段,才真正开始执行类中定义的java程序代码。
在准备阶段,变量已经付过一次初始值,而在初始化阶段,则根据程序员的代码来进行赋值,初始化阶段是执行类的构造器赋值的。这些资源有static{}块,构造函数,父类的初始化等。
至于使用和卸载阶段阶段,这里不再过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。
[jvm学习笔记]-类加载过程的更多相关文章
- JVM学习笔记——类加载过程
JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...
- 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的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
随机推荐
- 【机器学习】聚类算法:ISODATA算法
在之前的K-Means算法中,有两大缺陷: (1)K值是事先选好的固定的值 (2)随机种子选取可能对结果有影响 针对缺陷(2),我们提出了K-Means++算法,它使得随机种子 ...
- Mac022-brew安装tool
1.Mac上查看目录的树结构 Step1:安装tree命令 brew install tree Step2:某一目录下执行tree,会将该目录下的所有目录以树形结构显示 $ tree $ tree - ...
- python 并发编程 多线程与多进程的区别
1.开进程的开销远大于开线程 2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的 1 开进程的开销远大于开线程 from multiprocessing import Process de ...
- jenkins pipline和jenkinsfile
Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中. Jenkins Pipeline 提供了一套可扩展 ...
- MSF魔鬼训练营-3.1.1信息收集-通过DNS和IP地址挖掘目标网络信息
情报搜集环境站渗透测试全过程的80%~90% 一.外围信息搜集(公开渠道信息搜集OSINT open source intelligence) 3.1.1信息收集-通过DNS和IP地址挖掘目标网 ...
- 【转帖】docker 部署vsftpd服务
docker 部署vsftpd服务 https://blog.csdn.net/ctwy291314/article/details/82012860 转帖学习一下 docker部署vsftpd服务 ...
- 教你用 Netty 实现一个简单的 RPC!
众所周知,dubbo 底层使用了 Netty 作为网络通讯框架,而 Netty 的高性能我们之前也分析过源码,对他也算还是比较了解了. 今天我们就自己用 Netty 实现一个简单的 RPC 框架. 1 ...
- 小白学习django第二站-模版配置
上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...
- bootstrap modal 闪退的办法
调用:
- phpstudy配置多站点
1.打开vhosts.conf文件 目录 Apache/conf/vhosts.conf #开启apache的vhost模块 (此模块默认是关闭的,去掉前面的#号) LoadModule vh ...