【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载
C/C++在编译时需要进行连接,而Java的类加载、连接和初始化是在运行时完成的。
图 类的生命周期
图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定。
一、类加载过程
1、加载
加载是整个“类加载”过程的第一个阶段。这一步也叫“加载”,可以理解为把类从文件中读取到内存中并按一定数据结构保存以备后续使用。
主要分为三个步骤:
①通过类的全限定名获取其字节码。
②将字节码中的静态存储结构转换成方法区的运行时数据结构。
③在内存中创建一个代表这个类的java.lang.Class对象,作为该类的元数据访问入口。那么你现在知道了反射的时候,someClass.class这个对象是怎么来的了吧?只要拿到这个class你想创建实例、调用方法都行,想干哈就干哈。
数组的加载有所不同,因为数组本身是VM自己创建的,但数组中的元素类型可能是类,还是要靠类加载器去加载。所以数组的加载分两种情况:
①当数组的类型是引用类型,那就递归按照上面的方法加载。
②当数组的类型是基本数据类型如int [],则VM将会将该数组标记为与Bootstrap加载器关联。
2、验证
验证的目的是确保当前字节码文件中的内容,符合当前VM的要求,不会给VM运行造成危害。
验证过程包括:文件格式验证、元数据验证、字节码验证和符号引用验证。
这一步作用类似于语法检查。因为字节码的编译是在JVM之外进行的(可能来自本地jar包甚至网络),不同版本的编译器生成不同版本规范的字节码,可能带来兼容性问题。另外,也能防范恶意的字节码修改影响虚拟机的运行稳定。
3、准备
这个过程主要是为类变量分配内存(分配在方法区中)并赋默认初值(如int的初值为0,char为'\u0000')。
4、解析
解析是将常量池内的符号引用替换为直接引用的过程。
5、初始化
初始化就是执行构造方法的过程。
♣所以你应该知道了成员变量初始化时刻有两次 一次是在类加载的准备过程中、然后就是在调用构造方法的时候。 |
二、类加载器
类加载器有各自的类名称空间,两个类加载器即使加载了同一个.class文件,生成的类被认为是不同的类。这也可以理解,它们在方法区本来保存的就是两份。
1、类加载器分类
2、双亲委派模型
双亲委派的流程就是甩锅的过程。Bootstrap是顶层Loader,UserDef是底层Loader。底层Loader在接到类加载指令时啥也不干,把锅直接甩给上一层Loader,依次类推
直到锅甩到Bootstrap(也就是说所有的锅都会到它这儿)。如果Bootstrap的路径里有这个类,算它倒霉它加载,否则它再把锅弹回给下一层Loader—Extension,如果
Extension的类路径里有这个类,它加载。依次类推。。。
双亲委派模型的好处是:它的这种上层优先的层级关系保证了,类加载的有序性,不会因为各路Loader自行加载导致的混乱。
PS:Tomcat的类加载机制
https://blog.csdn.net/varyall/article/details/81610620
【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载的更多相关文章
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- 《深入理解Java虚拟机》学习笔记之类加载
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...
- (转)《深入理解java虚拟机》学习笔记6——类加载机制
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...
- 【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构
我为什么喜欢Java,另一个重要原因就是跨平台,WORA. 程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机. ♣Tip 其实这里存在两种无关性,一是平台无关性.另一个是语 ...
- 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域
一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...
- 「中国剩余定理CRT」学习笔记
设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...
- 《深入理解Java虚拟机》学习笔记
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...
随机推荐
- Delphi 获取DataSet传入参数后的SQL命令
ClientDataSet1.CommandText := sSQL; ClientDataSet1.Params.Clear; ClientDataSet1.CommandText :='SEL ...
- LODOP打印当前日期时间的方法
JS方法直接获取.之前有个详细介绍的博文:LODOP打印用JS获取的当前日期本文也再演示一下,详细介绍见上面链接的博文,该方法此文不做详细介绍. 本文有三段:1.JS获取日期,2,.LODOP的FOR ...
- parcel+vue入门
一.parcel简单使用 npm install -D parcel-bundler npm init -y (-y表示yes,跳过项目初始化提问阶段,直接生成package.json 文件.) Pa ...
- 启动django时报错Watching for file changes with StatReloader(使用状态加载程序监视文件更改 )
原因:可能是Django版本和Python版本或者PyMysql版本不一致 解决:升级或者降级Django版本 命令如下: pip install django==2.1.7 #django==版本号 ...
- 【CF715E】Complete the Permutations 第一类斯特林数
题目大意 有两个排列 \(p,q\),其中有一些位置是空的. 你要补全这两个排列. 定义 \(s(p,q)\) 为 每次交换 \(p\) 中的两个数,让 \(p=q\) 的最小操作次数. 求 \(s( ...
- 【dp】合唱队形
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为 ...
- [pip]upgrade outdated pip package on windows / 在windows上更新所有过时的pip包
首先更新pip自身: python -m pip install -U pip 查询过期包: pip list --outdated --format=columns Package Version ...
- P1417 烹调方案 (0/1背包+贪心)
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 文件上传XSS引发的安全问题
文件上传xss,一般都是上传html文件导致存储或者反射xss 一般后缀是html,之前疏忽了,没怎么考虑文件上传xss 如果没有 验证文件内容,却验证了后缀的情况下,使用: htm后缀: 测试代码: ...
- 将CSV文件存为HTML文件形式
# -*- coding: utf-8 -*- """ Created on Mon Apr 29 09:24:04 2019 @author: history &quo ...