0

0

JAVA虚拟机(JVM)详细介绍(五)——类加载机制

王林

王林

发布时间:2019-08-24 15:14:06

|

3032人浏览过

|

来源于CSDN

转载

上篇中我们讲解了class文件,这篇我们说说虚拟机是如何加载这些class文件的?class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。

类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。这一系列的过程都是在程序运行期间完成的。

类加载器

类加载器就是下图中红框的部分,它通过一个类的全限定名来获取描述此类的二进制字节流,从而将java类动态地加载进JVM的内存空间中。

20190619151934876.png

立即学习Java免费学习笔记(深入)”;

适用情景

对于一个非数组类的加载阶段,可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成。
对于数组类而言,其由java虚拟机直接创建,不通过类加载器。

双亲委派机制

双亲委派机制是类加载所采取的一种方式。如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一层的类加载器均是如此。只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。

20190619151231136.png

类比到现实:小明想买一个玩具挖土机,可他又不好意思直接张口说。所以,发生了下面的对话。

小明去问他爸爸:爸爸你有挖土机吗?
爸爸说:没有哎
接着爸爸问爷爷:爸爸爸爸,你有挖土机吗?
爷爷说:没有哎
接着爷爷问太爷爷:爸爸爸爸,你有挖土机吗?
太爷爷说:我也没有。让重孙子去买一个吧。
结果小明就高高兴兴地自己去买了一个玩具挖土机。

分类

启动类加载器是使用C++实现的,是虚拟机自身的一部分。
其它类加载器是由java语言实现的,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。

好处

以String类为例。就算是用户自己写了一个String类的实现,那对此类进行加载时,也只会委派给启动类加载器来对JDK中原本的String类进行加载,而自定义的String类永远不会被调用。这样保证了系统的安全。

什么时候进行类加载?

有且只有以下5种方式必须立即对类进行加载

(1)使用new实例化对象的时候;读取或配置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候;调用一个类的静态方法的时候。

(2)使用java.lang.reflect包的方法对类进行反射调用的时候。如果类没有进行过初始化,则需要先触发其初始化。

(3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的类),虚拟机会先初始化这个主类

类加载过程详述

类加载过程分为5步。大部分都是由虚拟机主导和控制的,除了以下两种情形:

酷表ChatExcel
酷表ChatExcel

北大团队开发的通过聊天来操作Excel表格的AI工具

下载

在加载阶段

开发人员可以通过自定义类加载器参与

在初始化阶段

会执行开发人员的代码去初始化类变量和其它资源

1、加载

虚拟机需要完成的事情:
(1) 通过一个类的全限定名来获取定义此类的二进制字节流。
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

20190619163630357.jpg

2、验证

验证的目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全。
其分为4个步骤:文件格式验证,元数据验证,字节码验证,符号引用验证。其中文件格式验证是直接对字节流进行操作的,其余3项是在方法区中进行的。

3、准备

此阶段是正式为类变量分配内存并设置类变量初始值的阶段。其是在方法区中进行分配的。有两个注意点:

(1)此时只是对类变量(被static修饰的变量)进行内存分配,而不是对象变量。给对象分配内存是在对象实例化时,随着对象一起分配到java堆中。

(2)如果一个类变量没有被final修饰,则其初始值是数据类型的零值。比如int类型的是0,boolean类型的是false。举个例子来说明:

public static int value=123;

在准备阶段过后的初始值为0而不是123,因为这个时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中。所以把value赋值为123的动作将在初始化阶段才会执行。

public static final int value=123;

此时因为有final,所以在准备阶段value就已经被赋值为123了。

4、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。可对类或接口、字段、类方法、接口方法等进行解析。

符号引用是什么:

符号引用就是包含类的信息,方法名,方法参数等信息的字符串,它供实际使用时在该类的方法表中找到对应的方法。

直接引用是什么:

直接引用就是偏移量,通过偏移量可以直接在该类的内存区域中找到方法字节码的起始位置。
符号引用是告诉你此方法的一些特征,你需要通过这些特征去寻找对应的方法。直接引用就是直接告诉你此方法在哪。

5、初始化

此阶段用于初始化类变量和其它资源,是执行类构造器()方法的过程,此时才是真正开始执行类中定义的java程序代码。

以上是对JAVA虚拟机类加载机制的详细讲解,更多相关问题请访问PHP中文网:JAVA视频教程

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

833

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号