JVM虚拟机系列(一)类的加载
JAVA虚拟机系列(一) 类的加载
目录
1 类的初始化过程
2 详解初始化时的各个阶段
一、类初始化的过程
先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class --->加载---->连接--->初始化---> 使用--->卸载。
我们将会在本章讨论一下xxxx.class--->加载--->连接---->初始化的过程。
讨论的方式采用自问自答模式:
1 首先类什么时候会被加载?
答:这一点JVM并没有强制约束,由不同的JVM供应商自行实现。但是是JVM规定了类初始化的有且只有的5种情况。
a 对静态属性和方法进行读写、NEW一个实例
b 通过反射Class.forName获取实例
c 初始化子类时他的父类没有进行过初始化,则会触发父类的初始化
d main函数入口的类
e JDK1.7动态语言的支持MethodHandle(这个暂时不理解)
另外这里需要提醒一下
A 接口的与类的区别,子类的初始化不会触发接口的初始化。
B NEW一个数组类不会触发当前数组类型的类的初始化,但会初始化JAVA虚拟机里面的一个继承object的数组的子类
例如 ClassArrayTest[] testArray = new ClassArrayTest[10] ,这句话不会初始化CLassArrayTest类的。
C 常量final 修饰的static属性被读取时不会触发初始化的过程
2 加载阶段是做了什么?
答:首先“加载”和“类加载”别混淆,加载是类加载的其中一个步骤(同样的初始化是类加载的最后一步)。,
言归正传,JVM在类需要初始化时会先把Class文件转换成二进制模式放入JVM控制的内存里面的方法区中,这个过程叫做加载。
3 连接的阶段是做了什么?(详情在4,5,6一并回答)
答:连接阶段分为三个步骤:验证、准备、解析(解析的步骤不确定是否会执行,因为它的执行顺序可以由虚拟机调节)。
4 验证
答:这一阶段的目的是为了确保Class的正确性,从以下几个方面展开
1 文件格式
版本号是否符合当前JVM范畴
文件是否完整
2 元数据
语法是否符合规范
3 字节码
堆栈的操作是否合理
4 符号引用
类里面属性和方法的访问权限是否正确
5 准备
答:这一阶段是为类的静态属性附上初始值,比如 整形是0,浮点是0.0f/d 引用类型是null。
提醒一点:final常量在这里是直接进行赋值的,所以他不会触发初始化。
6 解析
答:解析阶段是把符号引用转为直接引用。什么是符号引用呢?比如一个类中有个属性是一个其他类的实例 A a = new A(); 其中a 就是符号引用。
为什么需要这一步骤呢?按照我的理解是直接引用的意义明确而且无歧义,并且确保了被引用的对象一定已经创建(不创建哪来引用地址呢?)。
开始详解一下解析的过程。解析的过程分为2大块,类/接口解析与字段解析
1 类/接口的解析(创建其他类并且获取指针的过程)
step1 确定被引用的是否为数组,如果是数组则由虚拟机加载表示当前数组维度的数组类
step2 如果不是数组,则把这个需要加载的类传递给当前类的加载器进行加载
step3 如果1,2都通过时,则检查被引用类的访问权限,失败会抛出illegalAccessError
2 字段解析(在第一步的基础上把指针指向方法或者属性的过程)
step1 在被引用的类里面寻找需要的属性和方法,找到返回。
step2 第一步未找到时,从下至上遍历他的父类和接口直到找到object类结束
step3 step1和step2 都未能找到时则抛出NoSuchFieldError
7 初始化阶段做了什么?
答:类加载的最后一步了。为所有静态变量赋值和执行静态块语句。
另外JVM是会确保类的初始化被正确的加锁,以避免并发的风险。(利用这个机制,我们再进行单例模式设计时会使用到。)
JVM虚拟机系列(一)类的加载的更多相关文章
- jvm系列 (五) ---类的加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- JVM详解之:类的加载链接和初始化
目录 简介 加载 运行时常量池 类加载器 链接 验证 准备 解析 初始化 总结 简介 有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化 ...
- Java类的加载过程与ClassLoader的理解及测试
当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...
- 【Java】学习路径63-反射、类的加载-附思维导图(完结)
这一章的知识在实际开发也没有那么重要,主要是了解即可,另外掌握如何使用反射机制. 类的使用: 在虚拟机中: 类的加载->类的连接->类的初始化 类的加载 只会加载需要用到的类,加载到内 ...
- 类的加载classload和类对象的生成
在Java中最重要的可以说就是类的加载了.不论我们编写的功能多么复杂,或是多么简单,永远逃离不开的,就是将这个类从class文件加载到JVM中来. 类的加载过程 首先我们要了解一下类的加载过程,包括: ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- jvm系列一、java类的加载机制
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- 深入了解java虚拟机(JVM) 第十一章 类的加载
一.类加载机制概述 虚拟机把描述类的数据从class文件加载到内存并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 二.类加载的机制 类加载的过程 ...
随机推荐
- tp3.2.3自定义全局函数的使用
全局函数的定义,好处就是我们可以跨文件使用,而且调用方式可以直接调用,十分方便,在这里做个小记录 1.在Application/Home/Common目录下面新建一个名为function.php的文件 ...
- linux 命令——29 chgrp(转)
在 lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别 码都可以.Chgrp命令就是change grou ...
- 【BZOJ4698】[SDOI2008] Sandy的卡片(后缀数组+二分)
点此看题面 大致题意: 给你\(N\)个序列,若定义两个相同子串为一个子串内所有数加上一个数后能变成另一个串,求所有序列中的最长相同子串的长度. 简单的转化 首先,我们对题目进行一个简单的转化. 要求 ...
- RAID0 1 5 10原理、种类及性能优缺点对比
一.RAID模式优缺点的简要介绍 目前被运用较多的RAID模式其优缺点大致是这样的: 1.RAID0模式 优点:在RAID 0状态下,存储数据被分割成两部分,分别存储在两块硬盘上,此时移动硬盘的理论存 ...
- 选中ListBox控件中的全部项
实现效果: 知识运用: ListBox控件的SelectedItems属性 //获取ListBox控件中被选中数据项的集合 public ListBox.SelectedObjectCollectio ...
- file - 确定文件类型
总览 file [ -bcnsvzL ] [ -f 命名文件 ] [ -m 幻数文件 ] file ... 描述 本手册页说明了3.27版本 file 命令的使用. File 命令试图检查每个参数以判 ...
- 2017.12.14 Java实现-----图书管理系统
通过对图书的增删改查操作 用数组实现 Manager类 package demo55; import java.util.*; public class Manager { Scanner sc = ...
- React 服务端渲染最佳解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- Vue2+webpack+node 配置+入门+详解
Vue2介绍 1.vue2.0 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. Vue 的核心库只关注视图层 采用单文件组件 复杂大型单页应用程序(SPA) 响 ...
- mysql五:索引原理与慢查询优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...