【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 程 ...
随机推荐
- 解决Windows10中Virtualbox安装虚拟机没有64位选项
今天想在Windows 10系统安装完Virtualbox虚拟机,然后打算装一个CENTOS系统,但是选择安装系统的时候竟然没有64位操作系统的选项,经过一阵Google,终于解决了,在这里盘点一下出 ...
- 在Ubuntu 18.04系统上安装Systemback的方法(抄)
在Ubuntu 18.04系统上安装Systemback的方法 2018-12-26 21:39:05作者:林莉稿源:云网牛站 本文介绍如何在Ubuntu 18.04或者Ubuntu 18.10系统上 ...
- Python IDLE 代码高亮主题
Python IDLE 代码高亮主题 使用方法: 打开C盘我的 C:\Documents and Settings\你的用户名.idlerc文件夹 里面会有一个 config-highlight.cf ...
- python学习日记(继承和多态)
继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...
- 【BZOJ3997】[TJOI2015]组合数学(动态规划)
[BZOJ3997][TJOI2015]组合数学(动态规划) 题面 BZOJ 洛谷 题解 相当妙的一道题目.不看题解我只会暴力网络流 先考虑要求的是一个什么东西,我们把每个点按照\(a[i][j]\) ...
- ubuntu18.04 使用管理员权限
最近在ubuntu系统安装koa脚手架koa-generator初始化项目,报错提示要使用管理员权限执行命令. 正常情况下使用 sudo su 命令即可进入管理员权限,使用 su [ 用户名 ] 退出 ...
- java的数组
作用:存储相同类型的一组数组,相当于一个容器,存放数据的.对同种数据类型集中存储.管理.便于遍历 数组类型:就是数组中存储的数据的类型 特点:数组中的所有元素必须属于相同的数据类型,数组中所有元素在内 ...
- Node的安装和进程管理
安装nvm git clone https://github.com/creationix/nvm.git source nvm/nvm.sh 安装node nvm install 6.14.4(版本 ...
- python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法
使用python3.5.1执行post请求时,一直报错"POST data should be bytes or an iterable of bytes. It cannot be of ...
- Hive 锁处理
hive有两个锁,共享索(s) 和排它锁(x) 在进行ddl操作时,排他锁会阻止 ddl 操作.drop.alter table 如果一个hive查询使用到了表A,执行时间10分钟.在这10分钟内要d ...