当前位置:网站首页>JVM学习记录(七)——类加载过程与双亲委派模型
JVM学习记录(七)——类加载过程与双亲委派模型
2022-06-11 07:09:00 【--流星。】
类加载过程

加载
类加载过程的第一步,主要完成下面3件事情:
- 通过全类名获取定义此类的二进制字节流
- 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
- 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
验证
准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:
- 这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在 Java 堆中。
- 这里所设置的初始值"通常情况"下是数据类型默认的零值(如0、0L、null、false等),比如我们定义了
public static int value=111,那么 value 变量在准备阶段的初始值就是 0 而不是111(初始化阶段才会赋值)。特殊情况:比如给value 变量加上了 fianl 关键字public static final int value=111,那么准备阶段 value 的值就被赋值为 111。
解析
1、解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。
2、符号引用就是一组符号来描述目标,可以是任何字面量。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。在程序实际运行时,只有符号引用是不够的,举个例子:在程序执行方法时,系统需要明确知道这个方法所在的位置。Java
3、虚拟机为每个类都准备了一张方法表来存放类中所有的方法。当需要调用一个类的方法的时候,只要知道这个方法在方发表中的偏移量就可以直接调用该方法了。通过解析操作符号引用就可以直接转变为目标方法在类中方法表的位置,从而使得方法可以被调用。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。
初始化
初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法
<clinit>()方法的过程。对于
<clinit>()方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为<clinit>()方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。
对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化(只有主动去使用类才会初始化类):
- 当遇到 new 、 getstatic、putstatic或invokestatic 这4条直接码指令时,比如 new 一个类,读取一个静态字段(未被 final 修饰)、或调用一个类的静态方法时。
- 当jvm执行new指令时会初始化类。即当程序创建一个类的实例对象。
- 当jvm执行getstatic指令时会初始化类。即程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。
- 当jvm执行putstatic指令时会初始化类。即程序给类的静态变量赋值。
- 当jvm执行invokestatic指令时会初始化类。即程序调用类的静态方法。
- 使用
java.lang.reflect包的方法对类进行反射调用时如Class.forname(“…”),newInstance()等等。如果类没初始化,需要触发其初始化。- 初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。
- 当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类。
- MethodHandle和VarHandle可以看作是轻量级的反射调用机制,而要想使用这2个调用,就必须先使用findStaticVarHandle来初始化要调用的类。
- 当一个接口中定义了JDK8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。
类加载器
BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载
%JAVA_HOME%/lib目录下的jar包和类或者或被-Xbootclasspath参数指定的路径中的所有类。
ExtensionClassLoader(扩展类加载器) :主要负责加载目录
%JRE_HOME%/lib/ext目录下的jar包和类,或被java.ext.dirs系统变量所指定的路径下的jar包。
AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。
双亲委派模型的介绍
每一个类都有一个对应它的类加载器。系统中的 ClassLoder 在协同工作的时候会默认使用 双亲委派模型 。
在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。
加载的时候,首先会把该请求委派该父类加载器的
loadClass()处理,因此所有的请求最终都应该传送到顶层的启动类加载器BootstrapClassLoader中。当父类加载器无法处理时,才由自己来处理。

双亲委派模型的优点
- 可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类)
- 保证了 Java 的核心 API 不被篡改。如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为
java.lang.Object类的话,那么程序运行的时候,系统就会出现多个不同的Object类。
边栏推荐
- Cv2.rectangle() picture frame
- Explain the difference between void 0 and undefined
- 【CF #277.5 (Div. 2)】B. BerSU Ball
- Listen to the left width of the browser to calculate the distance
- Object. Specific implementation and difference between create() and new
- P3172 [cqoi2015] data selection (Mobius inversion + Du Jiao sieve)
- Education expert wangzhongze shared his experience for many years: family education is not a vassal
- AtomicInteger原子操作类
- Set center alignment
- 213. house raiding II
猜你喜欢

Xunwei dry goods | Ruixin micro rk3568 development board TFTP & NFS writing (Part 1)

Duality-Gated Mutual Condition Network for RGBT Tracking

Esp32 learning notes (49) - esp-wifi-mesh interface use
![[deploy private warehouse based on harbor] 4 push image to harbor](/img/af/8e28b229d94f3e6eab02308b69dc74.jpg)
[deploy private warehouse based on harbor] 4 push image to harbor

.NET C#基础(6):命名空间 - 有名字的作用域

Education expert Mr. wangzhongze: family education focuses on self growth
![P5431 [template] multiplicative inverse 2](/img/63/1cb95a55c9ce9b92d6d55381d0215b.jpg)
P5431 [template] multiplicative inverse 2

The rotation of the earth and the moon (II)

教育专家王中泽老师一招解决学生问题

一、SQLServer2008安裝(帶密碼)、創建數據庫、C#窗體項目測試
随机推荐
Education expert wangzhongze solves students' problems with one move
Error occurred in pycharm DeprecatedEnv: Env FrozenLake-v0 not found (valid versions include [‘FrozenLake-v1‘])
Mistakes in Niuke JS exercise
【CF】 A. New Year Candles
Senior openstacker - Bloomberg, vexxhost upgraded to the Gold member of openinfra Foundation
Janus feature draft
Modular notes
mybaits-puls 在xml文件中写sql语句 会报错 Invalid bound statement (not found):
Start the Nacos server of shell script
【CF#654 (Div. 2)】A. Magical Sticks
教育专家王中泽老师多年经验分享:家庭教育不是附庸品
Leetcode hot topic 100 topic 11-15 solution
About daily report plan
MS office level II wrong question record [6]
Luogu p1091 chorus formation (longest ascending subsequence)
Leetcode hot topic 100 topic 21-25 solution
1、 Sqlserver2008 installation (with password), database creation, C form project test
Group arrays by a specified size
Leetcode-9.Palindrome Numbber
Latex various arrows / arrows with text labels / variable length arrows
