[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的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
随机推荐
- redis学习(三)
如何保障reids的数据安全和性能? 一.持久化选项 1.快照snapshotting 它可以将存在于某一时刻的所有数据都写入硬盘里面. 配置选项示例: save 60 1000 注:从最近一次创 ...
- mysql——单表查询——聚合函数——示例
), km ), cj ) ); select * from score; ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ; 查询此同学的总成绩: ; ...
- flask url_for的用法
from flask import Flask,url_for app = Flask(__name__) @app.route('/') def hello_world(): print(url_f ...
- 四、Kubernetes_V1.10集群部署-master-创建kubeconfig
1.生成配置文件 # 创建 TLS Bootstrapping Token # export BOOTSTRAP_TOKEN=$( /dev/urandom | od -An -t x | tr -d ...
- 反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!
最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在<Cocos Creator游戏开发实战>中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反 ...
- [Python3] 030 常用模块 os
目录 os 1. os.getcwd() 2. os.chdir() 3. os.listdir() 4. os.makedir() 5. os.system() 6. os.getenv() 7. ...
- centos7 源码编译安装 nginx
安装步骤 下载 nginx 源码包 官网 $ wget http://nginx.org/download/nginx-1.16.0.tar.gz 解压 nginx 压缩包 $ tar -zxvf n ...
- laravel框架之及時更改
public function ajaxxiu(request $request) { $id = $request->post('id'); $fd = $request->post(' ...
- python:count 函数
API 一.string 中 某字符 的次数 str.count(sub, start= 0,end=len(string)) Args Annotations sub 搜索的子字符串 start 字 ...
- 32、出任爬虫公司CEO(爬取职友网招聘信息)
职友集,搜索到全国上百家招聘网站的最新职位. https://www.jobui.com/rank/company/ 打开网址后,你会发现:这是职友集网站的地区企业排行榜,里面含有 本 ...