搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Guff_9hys
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【记录&经验分享】——TensorFlow 2.1.0 GPU版安装成功经验分享_tensorflow-gpu==2.1.0安装
2
groubi下载、安装、激活、测试
3
Django 后端架构开发:DRF 高可用API设计与核心源码剖析_drf后端开源项目
4
【工具推荐】强大的“小程序反编译”工具推荐_小程序反编译工具
5
【数据库的连接查询】
6
软件开发不会立刻消失!
7
python并发测试脚本_压力测试python脚本由测试部维护
8
Neo4j底层存储结构_neo4j的数据库底层架构
9
Docker Compose运行Elasticsearch
10
聊聊测试工程师的核心能力模型_测试人员能力模型
当前位置:
article
> 正文
Java虚拟机类加载机制浅谈
作者:Guff_9hys | 2024-08-20 11:38:38
赞
踩
Java虚拟机类加载机制浅谈
Java虚拟机类加载机制浅谈
Java语言是一种编译后再经过解释器执行的过程, 解释器主要就是如何处理解释Class文件的二进制字节流。JVM主要包含三大核心部分:运行时数据区,类加载器和执行引擎。
虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、准备、解析和初始化,最终就会形成可以被虚拟机使用的Java类型,这就是一个虚拟机的类加载机制。Java中的类是动态加载的,只有在运行期间使用到该类的时候,才会将该类加载到内存中,Java依赖于运行期动态加载和动态链接来实现类的动态使用。
一个类的整个生命周期如下:
加载,验证,准备,初始化和卸载在开始的顺序上是固定的,但是可以交叉进行。
在Java中,对于类有且仅有四种情况会对类进行“初始化”。
1)使用new关键字实例化对象的时候,读取或设置一个类的静态字段时候(除final修饰的static外),调用类的静态方法时候,都只会初始化该静态字段或者静态方法所定义的类。
2)使用reflect包对类进行放射调用的时候,如果类没有进行初始化,则先要初始化该类
3)当初始化一个类的时候,如果其父类没有初始化过,则先要触发其父类初始化。
4)虚拟机启动的时候,会初始化一个有main方法的主类。
注意:通过子类引用父类静态字段,只会初始化父类不会初始化子类;通过数组定义来引用类,也不会触发该类的初始化;常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此也不会触发定义常量的类的初始化。
一、类加载过程
1、加载
加载阶段主要完成三件事,即通过一个类的全限定名来获取定义此类的二进制字节流,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,在Java堆中生成一个代表此类的Class对象,作为访问方法区这些数据的入口。这个加载过程主要就是靠类加载器实现的,这个过程可以由用户自定义类的加载过程。
2、验证
这个阶段目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证:
文件格式验证:基于字节流验证,验证字节流是否符合Class文件格式的规范,并且能被当前虚拟机处理。
元数据验证:基于方法区的存储结构验证,对字节码描述信息进行语义验证。
字节码验证:基于方法区的存储结构验证,进行数据流和控制流的验证。
符号引用验证:基于方法区的存储结构验证,发生在解析中,是否可以将符号引用成功解析为直接引用。
3、准备
仅仅为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即零值,这里不包含用final修饰的static,因为final在编译的时候就会分配了,同时这里也不会为实例变量分配初始化。类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
4、解析
解析主要就是将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析。
这里要注意如果有一个同名字段同时出现在一个类的接口和父类中,那么编译器一般都会拒绝编译。
5、初始化
初始化阶段依旧是初始化类变量和其他资源,这里将执行用户的static字段和静态语句块的赋值操作。这个过程就是执行类构造器方法的过程。
方法是由编译器收集类中所有类变量的赋值动作和静态语句块的语句生成的,类构造器方法与实例构造器方法不同,这里面不用显示的调用父类的方法,父类的方法会自动先执行于子类的方法。即父类定义的静态语句块和静态字段都要优先子类的变量赋值操作。
二、类加载器
1、类加载器的分类
启动类加载器(Bootstrap ClassLoader): 主要负责加载lib目录中的,或是-Xbootclasspath参数指定的路径中的,并且可以被虚拟机识别(仅仅按照文件名识别的)的类库到虚拟机内存中。它加载的是System.getProperty("sun.boot.class.path")所指定的路径或jar。
扩展类类加载器(Extension ClassLoader):主要负责加载libext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。它加载的是
托福答案
System.getProperty("java.ext.dirs")所指定的路径或jar。
应用程序类加载器(Application ClassLoader):也叫系统类加载器,主要负责加载ClassPath路径上的类库,如果应用程序没有自定义自己类加载器,则这个就是默认的类加载器。
它加载的是System.getProperty("java.class.path")所指定的路径或jar。
2、类加载器的特点
1)运行一个程序时,总是由Application Loader(系统类加载器)开始加载指定的类。
2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
3、类加载器的双亲委派模型
类加载器双亲委派模型的工作过程是:如果一个类加载器收到一个类加载的请求,它首先将这个请求委派给父类加载器去完成,每一个层次类加载器都是如此,则所有的类加载请求都会传送到顶层的启动类加载器,只有父加载器无法完成这个加载请求(即它的搜索范围中没有找到所要的类),子类才尝试加载。
下面是一个类加载器双亲委派模型,这里各个类加载器并不是继承关系,它们利用组合实现的父类与子类关系。
4、类加载的几种方式
1)命令行启动应用时候由JVM初始化加载,加载含有main的主类。
2)通过Class.forName()方法动态加载类,默认会执行初始化块。如果指定了ClassLoader,则不会执行初始化块。
3)通过ClassLoader.loadClass()方法动态加载类,不会执行初始化块。
5、类加载实例
当在命令行下执行:java HelloWorld(HelloWorld是含有main方法的类的Class文件),JVM会将HelloWorld.class加载到内存中,并在堆中形成一个Class的对象HelloWorld.class。
基本的加载流程如下:
1)寻找jre目录,寻找jvm.dll,并初始化JVM;
2)产生一个Bootstrap Loader(启动类加载器);
3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为BootstrapLoader。
4)Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为ExtendedLoader。
5)最后由AppClass Loader加载HelloWorld类。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Guff_9hys/article/detail/1006966
推荐阅读
article
最新
Java
高频
面试
集锦
,
让你“
金九银
十”轻松斩获
offer
_高级
java
开发
面试
题大全...
这是一份全面的
Java
面试
指南
,
涵盖了从基础到高级的208道
面试
题
,
包括
Java
基础、容器、多线程、反射、网络、设计模式...
赞
踩
article
java
exec
执行
tar
_
java
调用
系统命令
获
MAC
、
解压缩
tar
包...
public class procee {public static void main(String[] args) ...
赞
踩
article
推荐文章:
阿里
云
SDK
管理型
凭证
提供者
for
Java
—— 让
云
服务访问更安全、便捷......
推荐文章:
阿里
云
SDK
管理型
凭证
提供者
for
Java
—— 让
云
服务访问更安全、便捷 aliyun-sdk-mana...
赞
踩
article
八大
排序
算法
总结与
java
实现_
八大
排序
算法
演示
java
csdn
...
原文链接:
八大
排序
算法
总结与
java
实现 - iTimeTraveler概述因为健忘,加上对各种
排序
算法
理解不深刻,过...
赞
踩
article
Java
集合框架:
Java
中的
优先级
队列
PriorityQueue
的实现_
java
coll...
在
Java
中是一种基于堆(Heap)数据结构实现的
优先级
队列。堆是一种特殊的完全二叉树,分为最小堆和最大堆。在最小堆...
赞
踩
article
RabbitMQ
之
Windows
下的
安装
部署
_
rabbitmq
-
java
-
client
插件下载...
本文详细介绍了在
Windows
环境下
安装
部署
RabbitMQ
的步骤,包括配置Erlang环境,设置环境变量,
安装
Rabb...
赞
踩
article
CentOS
上安装
Java
17...
要在
CentOS
上安装
Java
17,您可以使用多种方法。这里我将向您展示如何通过下载 Oracle 提供的 Ja...
赞
踩
article
【CentOS】
安装
Java
环境_
centos
安装
java
环境...
本文档详细介绍了如何在CentOS7系统上
安装
JDK 1.8。首先,通过XShell上传JDK
安装
包到指定目录并解压。接...
赞
踩
article
Java
SpringBoot
各种
参数
配置
方式的
优先级
_
java
启动
参数
优先级
...
本文主要讨论了在
Java
中,命令行
参数
(-Dxxx=xxx)的设置如何遵循
优先级
规则,即高于application.pr...
赞
踩
article
【
Java
Web】014 --
SpringBoot
原理(配置
优先级
、
Bean
管理、SpringB...
SpringBoot
原理(配置
优先级
、
Bean
管理、
SpringBoot
原理),内容注意包括:配置文件(.propert...
赞
踩
article
java
springboot
配置
方式
优先级
排序_
java
的
配置
文件
的
优先级
...
本文介绍了在SpringBoot项目中,包括application.yaml和application.propertie...
赞
踩
article
Java
8
并发
集合
:安全高效的
多线程
集合
_
concurrenthashmap
和concurrent...
在
多线程
环境中,使用线程安全的数据结构非常重要,以避免竞态条件和数据不一致的问题。
Java
8引入了一些
并发
集合
类,提供...
赞
踩
article
Java
并发
集合
:高效线程安全的
数据结构
...
Java
并发
集合
:高效线程安全的
数据结构
大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序...
赞
踩
article
Java
集合
系列之并发包(
java
.
util
.
concurrent
)下
的
高级
集合
类_
java
con...
先看一张描述
java
.
util
.
concurrent
包下
集合
组成结构
的
类图下列介绍
的
集合
统一特性:线程安全,支持并发操作...
赞
踩
article
【
Java
基础】
Java
并发
集合
容器_
java
并发
集合
...
ConcurrentHashMap是
Java
中的一个线程安全的哈希表实现,它是HashMap的线程安全版本。与HashM...
赞
踩
article
Java
-
正则表达式
...
Java
提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正则表达...
赞
踩
article
题解 | #最大差值# c++&
amp
;
java
&
amp
;
Python3
_
增长率
最高值与最低值相...
天地不仁,以万物为刍狗。今天笔试题一做,难度和之前站点都不在同一级别,SQL题是窗口聚合,编程题是一大堆,处理输入都要好...
赞
踩
article
华为
OD
机试
- 分
披萨
(
Java
& JS &
Python
&
C
&
C
++
)...
本文介绍了一道关于公平分
披萨
的算法问题,问题背景是吃货和馋嘴两人需要轮流从
披萨
切块中选取,以最大化吃货的份额。文章详细解...
赞
踩
article
【华为OD机试】
分
披萨
(
动态
规划-
Java
&
Python
&
C++
&JS实现)_
java
分
披萨
...
本文介绍了如何运用
动态
规划解决华为OD机试中的一道
分
披萨
问题。通过
分
析题意,阐述解题思路,提供
Java
、
Python
、C...
赞
踩
article
【
华为
OD
机试
真题
】456、
分
披萨
|
机试
真题
+
思路
参考+代码解析(CD卷)(本题
100%
)(C+...
题目描述>"吃货" 和 " 馋嘴 "两人到
披萨
店点了一份铁盘(圆形)
披萨
,并让店员将
披萨
按放射状切成大小相同的偶数扇形小...
赞
踩
相关标签
java
面试
开发语言
职场和发展
mysql
java exec执行tar
排序
排序算法
归并排序
冒泡排序
栗筝i 的 Java 技术栈
Java 基础
Java 集合
Java 堆排序
优先级队列
rabbitMQ安装部署
centos
linux
spring boot
Java Web
SpringBoot