【JVM】详解类加载机制
JVM的类加载机制
- 一、类的生命周期
- 二、类加载的过程
- 1.加载
- 2.连接
- 3.初始化
- 三、类加载器的介绍
- 3.1 启动类加载器(根类加载器/引导类加载器)(Bootstrap ClassLoader)
- 3.2 扩展类加载器
- 3.3 系统类加载器
- 四、双亲委派模型
- 4.1 双亲委派模型的优点
- 4.2 双亲委派模型的破坏
一、类的生命周期
对于一个类来说,它的生命周期是这样的:
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化三个步骤对该类进行初始化。所以将这三个步骤称为类加载。
其中连接又分为三步:验证、准备、解析。
下面我们来仔细了解一下类加载的过程:
二、类加载的过程
1.加载
- 加载是将类的class文件读入到内存,并将这些静态数据转换成方法区中的运行时数据结构,并在堆中生成一个代表这个类的
java.lang.Class
对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
2.连接
当类被加载之后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将java类的二进制代码合并到JVM的运行状态中)。
类连接又可分为以下三个阶段:
- 验证:确保加载的类信息是否符合JVM规范,有没有安全方面的问题。主要验证是否符合Class文件格式规范,并且是否能被当前的虚拟机加载处理。
- 准备:正式为类中定义的变量(静态变量)分配内存并设置类变量默认初始值阶段,这些内存都将再方法区中进行分配。
- 解析:虚拟机常量池的符号引用替换成直接引用的过程,也就是初始化变量的过程。 符号引用:是一组符号来描述所引用的目标,符号可以是任何的字面形式的字面量,只要不会出现冲突能够定位到就行。布局和内存无关。 直接引用:是指向目标的指针,偏移量或者能够直接定位的句柄,该引用是和内存中的布局有关的,并且一定加载进来的。
3.初始化
初始化是为类的静态变量赋予正确的初始值,准备阶段和初始化阶段看似有点矛盾,其实不然。 比如这样的一句代码:private static int a=10;
,在准备阶段给a赋值是int类型的默认初始值0,到初始化这一阶段才会把a真正的值10赋给它。
三、类加载器的介绍
类加载器就是在类加载阶段实现“通过一个类的全限定名(包名+类名)来获取类的二进制字节流”这个动作的。
3.1 启动类加载器(根类加载器/引导类加载器)(Bootstrap ClassLoader)
它用来加载Java的核心类,是用原生代码来实现的,并不继承自java.lang.ClassLoader
.由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。负责加载扩展类加载器和系统类加载器,并为他们的指定父类加载器。
3.2 扩展类加载器
由Java语言编写的,派生于ClassLoader类,上层类加载器为启动类加载器。它负责加载JRE/lib/ext目录下的类。
3.3 系统类加载器
Java语言编写,派生于ClassLoader类,上层类加载器为扩展类加载器。负责加载我们自己定义的类。
四、双亲委派模型
工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果费雷加载器还存在其父类加载器,则进一步向上委托,一次递归,请求最终将到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就成功返回,如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
也就是每个儿子都很懒,每次有活交给父亲去干,直到父亲说这件事我也干不了的时候,儿子才自己想办法。
4.1 双亲委派模型的优点
- 避免类的重复加载:比如A类和B类都有一个父类C类,那么A启动时就会将C类加载起来,那么B类进行加载的时候就不需要重复加载C类了。
- 安全性:使用双亲委派模型可以保证Java核心API不被篡改。假设通过网络传递一个名为
java.lang.Integer
的类,通过双亲委派莫辛纳甘传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已经被加载了,并不会重新加载网络传递过来的java.lang.Integer
类,而是直接返回已加载过的Integer.class
,这样便可以防止核心API库被随便篡改。
4.2 双亲委派模型的破坏
双亲委派模型的弊端:不能向下委派,不能不委派。
那么我们要打破双亲委派模型:也就是能向下委派和不委派。
向下委派:SPI机制
SPI机制
SPI机制是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里定义的类。这一机制为很多框架扩展提供了可能,比如在JDBC中就使用到了SPI机制。
SPI机制如何打破双亲委派模型:
在某些情况下父类加载器需要委托子类加载器去加载class文件。受加载范围的限制,父类加载器无法加载到需要的文件。
以Drive接口为例,DriverManger通过启动类加载器加载进来,而com.mysql.jdbc.Driver是通过系统类加载器加载进来的。由于双亲委派模型父类加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类加载器来加载Driver实现,从而破坏了双亲委派模型。
【JVM】详解类加载机制相关推荐
- JVM详解(类加载,内存分配,GC,内存模型)
一. 背景 1. 前言 作为一位Java开发工作者,在关心业务代码开发的同时,我们也需要了解java底层时如何运作的,了解为什么说java是跨平台的语言,所以这一篇对JVM(java虚拟机)进行剖析和 ...
- JVM——详解类加载过程
导航 一.过程概述 二.Loading 2.1 类加载器 2.2 双亲委派机制 2.3 类在内存中的结构 三.Linking 四.Initializing 一.过程概述 java 源文件编译后会生成一 ...
- JVM详解——什么是JVM、JVM优点
JVM详解--什么是JVM.JVM优点 最近在学习Java,经常在书中看到JVM这三个字母,那到底什么是JVM呢? 并且JVM的知识在Java面试中也是非常受面试官青睐的知识点,那对于JVM我们到底要 ...
- java vm 远程监控配置文件_Java VisualVM监控远程JVM(详解)
我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其是内存的消耗是非常庞大,JDK1.6开始自带的VisualV ...
- jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区
jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...
- Java虚拟机(Jvm详解)
Java虚拟机(Jvm详解) 总体知识点框架 1.运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) Java 虚拟机规范对 ...
- JVM基础 - JAVA类加载机制
JVM基础 - JAVA类加载机制 类的生命周期 其中类加载的过程包括了 加载 . 验证 . 准备 . 解析 . 初始化 五个阶段.在这五个阶段中, 加载 . 验证 . 准备 和 初始化 这四个阶段发 ...
- Android 全局大喇叭——详解广播机制
Android 全局大喇叭--详解广播机制 一.广播机制简介 1. 标准广播(Normal broadcasts) 2. 有序广播(Ordered broadcasts) 二.接收系统广播 1. 动态 ...
- 深入理解JVM(5)——虚拟机类加载机制
在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...
最新文章
- 智能算法之Matlab实现(1)——遗传算法(1)
- rust(43)-rust语言特点与版本发布
- OS / 5 种 IO 模型
- 计算机管理没有打印机列队,在Windows清除打印队列如果打印机被卡住,也没有打印输出...
- vscode 模糊部分代码_本周 GitHub 速览:您的代码有声儿吗?(Vol.38)
- VS2017编译的一些小知识记录
- Chart.js学习
- Nginx配置SSL后不能正常访问解决方法
- PHP被浏览器解释成注释,HTML+CSS入门 在HTML中嵌入的php代码会被浏览器注释掉如何解决...
- Evaluate that you caught up with the price cut
- JavaScript 获取小数任一小数点后的位数的小数
- oracle数据库面试题及答案
- 天翼网关-无线光纤猫的设置和有WIFI信号无网络问题排查与解决
- MATLAB:数值微积分
- PHP汉字取拼音缩写
- 亿玛大数据揭秘“钻石网购密码” 最高单价超15万
- windows ce 专题
- mysql数据库的配置
- js 遍历对象的方式
- 电力系统频率 matlab,低频减载的MATLAB仿真模型
热门文章
- 实验六、8254定时/计数器实验
- 爬取最好大学网数据、分析并可视化操作
- ubuntu查看core dumped的详细错误原因
- 教师资格证计算机科目有哪些内容,中学教师资格证的具体考试科目都有哪些?...
- 【AI折腾录】stable web ui基础【sd安装、lora vae embedding hyperwork等基础概念】
- IDEA 下载与安装
- FlexSlider 轮播图插件 的详细设置参数
- SQLSERVER 清理日志文件的方法
- Pytorch Illegal instruction 解决(鸵鸟战术)
- html 空心字 以及部分艺术字