JVM的类加载机制

  • 一、类的生命周期
  • 二、类加载的过程
    • 1.加载
    • 2.连接
    • 3.初始化
  • 三、类加载器的介绍
    • 3.1 启动类加载器(根类加载器/引导类加载器)(Bootstrap ClassLoader)
    • 3.2 扩展类加载器
    • 3.3 系统类加载器
  • 四、双亲委派模型
    • 4.1 双亲委派模型的优点
    • 4.2 双亲委派模型的破坏

一、类的生命周期

对于一个类来说,它的生命周期是这样的:

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载连接初始化三个步骤对该类进行初始化。所以将这三个步骤称为类加载
其中连接又分为三步:验证、准备、解析

下面我们来仔细了解一下类加载的过程:

二、类加载的过程

1.加载

  1. 加载是将类的class文件读入到内存,并将这些静态数据转换成方法区中的运行时数据结构,并在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。

2.连接

当类被加载之后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将java类的二进制代码合并到JVM的运行状态中)。

类连接又可分为以下三个阶段:

  1. 验证:确保加载的类信息是否符合JVM规范,有没有安全方面的问题。主要验证是否符合Class文件格式规范,并且是否能被当前的虚拟机加载处理。
  2. 准备:正式为类中定义的变量(静态变量)分配内存并设置类变量默认初始值阶段,这些内存都将再方法区中进行分配。
  3. 解析:虚拟机常量池的符号引用替换成直接引用的过程,也就是初始化变量的过程。 符号引用:是一组符号来描述所引用的目标,符号可以是任何的字面形式的字面量,只要不会出现冲突能够定位到就行。布局和内存无关。 直接引用:是指向目标的指针,偏移量或者能够直接定位的句柄,该引用是和内存中的布局有关的,并且一定加载进来的。

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】详解类加载机制相关推荐

  1. JVM详解(类加载,内存分配,GC,内存模型)

    一. 背景 1. 前言 作为一位Java开发工作者,在关心业务代码开发的同时,我们也需要了解java底层时如何运作的,了解为什么说java是跨平台的语言,所以这一篇对JVM(java虚拟机)进行剖析和 ...

  2. JVM——详解类加载过程

    导航 一.过程概述 二.Loading 2.1 类加载器 2.2 双亲委派机制 2.3 类在内存中的结构 三.Linking 四.Initializing 一.过程概述 java 源文件编译后会生成一 ...

  3. JVM详解——什么是JVM、JVM优点

    JVM详解--什么是JVM.JVM优点 最近在学习Java,经常在书中看到JVM这三个字母,那到底什么是JVM呢? 并且JVM的知识在Java面试中也是非常受面试官青睐的知识点,那对于JVM我们到底要 ...

  4. java vm 远程监控配置文件_Java VisualVM监控远程JVM(详解)

    我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其是内存的消耗是非常庞大,JDK1.6开始自带的VisualV ...

  5. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区

    jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...

  6. Java虚拟机(Jvm详解)

    Java虚拟机(Jvm详解) 总体知识点框架 1.运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) Java 虚拟机规范对 ...

  7. JVM基础 - JAVA类加载机制

    JVM基础 - JAVA类加载机制 类的生命周期 其中类加载的过程包括了 加载 . 验证 . 准备 . 解析 . 初始化 五个阶段.在这五个阶段中, 加载 . 验证 . 准备 和 初始化 这四个阶段发 ...

  8. Android 全局大喇叭——详解广播机制

    Android 全局大喇叭--详解广播机制 一.广播机制简介 1. 标准广播(Normal broadcasts) 2. 有序广播(Ordered broadcasts) 二.接收系统广播 1. 动态 ...

  9. 深入理解JVM(5)——虚拟机类加载机制

    在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...

最新文章

  1. 智能算法之Matlab实现(1)——遗传算法(1)
  2. rust(43)-rust语言特点与版本发布
  3. OS / 5 种 IO 模型
  4. 计算机管理没有打印机列队,在Windows清除打印队列如果打印机被卡住,也没有打印输出...
  5. vscode 模糊部分代码_本周 GitHub 速览:您的代码有声儿吗?(Vol.38)
  6. VS2017编译的一些小知识记录
  7. Chart.js学习
  8. Nginx配置SSL后不能正常访问解决方法
  9. PHP被浏览器解释成注释,HTML+CSS入门 在HTML中嵌入的php代码会被浏览器注释掉如何解决...
  10. Evaluate that you caught up with the price cut
  11. JavaScript 获取小数任一小数点后的位数的小数
  12. oracle数据库面试题及答案
  13. 天翼网关-无线光纤猫的设置和有WIFI信号无网络问题排查与解决
  14. MATLAB:数值微积分
  15. PHP汉字取拼音缩写
  16. 亿玛大数据揭秘“钻石网购密码” 最高单价超15万
  17. windows ce 专题
  18. mysql数据库的配置
  19. js 遍历对象的方式
  20. 电力系统频率 matlab,低频减载的MATLAB仿真模型

热门文章

  1. 实验六、8254定时/计数器实验
  2. 爬取最好大学网数据、分析并可视化操作
  3. ubuntu查看core dumped的详细错误原因
  4. 教师资格证计算机科目有哪些内容,中学教师资格证的具体考试科目都有哪些?...
  5. 【AI折腾录】stable web ui基础【sd安装、lora vae embedding hyperwork等基础概念】
  6. IDEA 下载与安装
  7. FlexSlider 轮播图插件 的详细设置参数
  8. SQLSERVER 清理日志文件的方法
  9. Pytorch Illegal instruction 解决(鸵鸟战术)
  10. html 空心字 以及部分艺术字