[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的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
随机推荐
- 【VS开发】VC实现程序重启的做法
转载地址:http://blog.csdn.net/clever101/article/details/9327597 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是 ...
- AKKA学习(二) 未完
Actor调用 从上面的例子中,我们可以大概的对AKKA在JAVA中的使用有一个全局的概念.这里我们在稍微细致的讲解一下. 在JAVA中使用AKKA进行开发主要有这几个步骤: 定义消息模型. 创建Ac ...
- Spring(十)--Advisor顾问
Spring之Advisor顾问 1. 创建新的xml文件 advisor.xml <!--01. 配置目标对象 实际肯定是配置UserServiceImpl--> <bean i ...
- python pycharm 注册码
D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- Nginx教程(一)-全面认知
什么是 nginx nginx 是一款高性能的 http 服务器,反向代理服务器,电子邮件(IMAP/POP3)代理服务器: 它的特点就是高性能,占用内存少,支持高并发,运行稳定: 官方测试 可支持 ...
- centos python environment
3. 在Centos7的docker里装好了httpd,运行报错: $ systemctl start httpd.service Failed to get D-Bus connection: Op ...
- python内置下载服务器
python内置了一个下载服务器.例如你的同事要让你传的文件位于某一个目录下面,那么你可以进入这个目录,然后执行下面的命令启动一个下载服务器 python2 python -m SimpleHTTPS ...
- sqlserver2008 必知必会技巧-- 快速索引对象
对象资源管理器里面 -- 数据库 -- 表目录 ,然后按 f7 弹出 对象资源管理详细信息 , 里面有搜索栏 , 可以 使用 % 进行模糊查询 例如我们查包含 student的表 %student% ...
- 经典解压缩软件 WinRAR 5.80 sc 汉化去广告版
目录 1. 按 2. 提醒 3. 下载地址 1. 按 WinRAR拥有全球超过五千万的用户,是目前最受欢迎的压缩软件, 没有比它更加好的方法来实现高效安全的文件传输,减少电子邮件传输时间,或是迅速压缩 ...
- 当有多个相同的DIV时,我怎么判断我点击的是哪个
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...