JVM的类加载过程详细说明

 更新时间:2021年6月2日 00:00  点击:1424

一、基础知识

我们平时写的Java写代码一般都是.java文件,编译成为.class字节码文件,然后类加载器把.class文件加载到JVM内存中,接下来JVM就执行我们的字节码文件,整个过程就是这样。

画个图方便大家好理解:

在这里插入图片描述

类加载过程其实非常琐碎且复杂,但是我们只要把握其中的核心工作原理即可

一个类从加载到使用会经历以下步骤:

加载-〉验证-〉准备-〉解析-〉初始化-〉使用-〉卸载

以以下ClassLoadDemo类代码举例:

/**
 * @author god-jiang
 * @date 2021/5/29
 */
public class ClassLoadDemo {

    private static int count = 666;

    public static void main(String[] args) {
        ReplicaManager replicaManager = new ReplicaManager();
    }
}

二、加载

那么什么时候会加载一个类呢?答案很简单,当你使用到这个类的时候JVM就会去加载。示例代码main函数是入口,会加载ClassLoadDemo.class字节码,又因为main函数使用了ReplicaManager.class,所以继续加载。

在这里插入图片描述

三、验证

验证这一步,是根据JVM规范,来校验你加载进来的.class文件的内容是否符合规范。当你的.class文件被人恶意修改了,字节码不符合JVM规范,那么JVM是没法执行这个字节码的。所以.class被加载到内存中需要验证,通过了之后才能交给JVM来运行

四、准备

准备这一步,就是给你的class中的类分配一定的内存空间,比如ClassLoadDemo类,就会给它分配内存空间,然后给它里面的static变量分配内存空间,给一个默认的初始值。

PS:int的默认值为0,boolean的默认值是false,引用类型的默认值为null,以此类推。

五、解析

解析这一步,实际上就是把符号引用替换为直接引用的过程。这一部分涉及JVM底层,有点复杂,所以不再深究。

以上三步,就核心就是“准备阶段”。因为这个阶段是给加载进来的类分配好了内存空间,类变量也分配了内存空间,并且给了默认的初始值,这个概念,大家心里一定要有。

六、核心阶段:初始化

上面讲过准备阶段会给类变量分配一个内存空间,然后给初始值。但是赋值这一段逻辑在哪里执行呢?答案就是在初始化阶段。

以上的示例代码ClassLoadDemo.class的count变量在准备阶段就是给一个默认值0,但是到了初始化就会赋值为666。

知道了类的加载过程,那么什么时候初始化一个类呢?这里有一个非常重要的规则,就是如果初始化一个类,发现他的父类还没初始化,那么必须先初始化他的父类。

到这里大家应该对类加载的整个过程都有一定的了解,我再根据以上内容画一个张图方便理解。

在这里插入图片描述

现在相信大家已经搞明白了整个类加载从触发时机到初始化的过程了,那么还有一个重要的知识点是类加载器,接着分享。

类加载器

JVM的类加载器主要有四种,Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader,还有一个是自定义类加载器。接下来我来介绍一下他们。

启动类加载器

Bootstrap ClassLoader主要负责加载我们在电脑上安装的Java目录下的核心类。比如我们安装的JDK下就有一个lib目录,里面放着Java最核心的类,支持着Java系统的运行。

扩展类加载器

Extension ClassLoader也是类似的,在我们安装的JDK中有一个lib/ext目录,这里面有一些类就是需要使用这个类加载器加载,支持你的Java系统运行。

应用程序类加载器

Application ClassLoader负责去加载ClassPath环境变量所指定的类,其实可以大概理解为加载你写好的Java代码,然后这个类加载器帮我们把写好的代码加载到内存中运行。

自定义类加载器

除了以上的三种类加载器,我们还可以自定义类加载器,根据自己的需求加载类。

七、双亲委派机制

JVM的类加载器是有亲子层级结构,启动类加载器是处于最上层的,扩展类加载器在第二层,第三层是应用程序类加载器,最后一层是自定义加载器。

在这里插入图片描述

双亲委派机制说的是,假设你的应用程序需要加载一个类,它会首先委派给自己的父类加载器去加载,最后到Bootstrap ClassLoader加载器。

如果最上层的类加载器加载不了,他就会下推权利给下面的类加载去加载,一层层下来。

八、总结

今天分享了类加载过程还有类加载器的相关知识,主要以我的学习理解还有图来更加直观的理解这个知识点。

希望以上的内容对你们有所帮助。

到此这篇关于JVM的类加载过程详细说明的文章就介绍到这了,更多相关JVM类加载内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • 浅谈Java自定义类加载器及JVM自带的类加载器之间的交互关系

    这篇文章主要介绍了浅谈Java自定义类加载器及JVM自带的类加载器之间的交互关系,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • 教你一文搞懂Kotlin中的Jvm注解

    这篇文章主要介绍了教你一文搞懂Kotlin中的Jvm注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-11
  • java应用开发之JVM运行时内存分析

    这篇文章主要介绍了java应用开发之JVM运行时内存,文中附含图文示例内容分析非常简要,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-16
  • 深入理解Java之jvm启动流程

    这篇文章主要介绍了深入理解Java之jvm启动流程,文章内容讲解的很清晰,有对这方面感兴趣的同学可以研究下...2021-02-09
  • 一篇文章带你了解JVM垃圾回收

    这篇文章主要介绍了JVM的种垃圾回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-08-15
  • Java面试题冲刺第二十九天--JVM3

    这篇文章主要为大家分享了最有价值的三道关于JVM的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下...2021-09-12
  • JVM系列之:再谈java中的safepoint说明

    这篇文章主要介绍了JVM系列之:再谈java中的safepoint说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-14
  • 面试时必问的JVM运行时数据区详解

    这篇文章主要介绍了JVM运行时数据区原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-08-16
  • 面试必时必问的JVM 类加载机制详解

    这篇文章主要介绍了一文读懂Jvm类加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-08-16
  • 图解JVM内存模型

    这篇文章主要介绍了JVM内存模型的相关资料,帮助大家更好的理解和学习Java虚拟机,感兴趣的朋友可以了解详细...2020-10-15
  • 深入理解Java虚拟机 JVM 内存结构

    本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍...2021-09-24
  • 浅谈JVM中的JOL

    我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码。今天,给大家介绍一款工具JOL,可以满足大家对java对象的所有想象。...2021-06-02
  • JVM中对象的创建与OOP-Klass模型

    这篇文章主要介绍了JVM中对象的创建与OOP-Klass模型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • 华为技术专家讲解JVM内存模型(收藏)

    这篇文章主要介绍了华为技术专家讲解JVM内存模型(收藏)的相关知识,本文给大家介绍的非常详细,具有一定的收藏借鉴价值,需要的朋友可以参考下...2021-05-06
  • 本地jvm执行flink程序带web ui的操作

    这篇文章主要介绍了本地jvm执行flink程序带web ui的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-14
  • 浅谈JVM垃圾回收之哪些对象可以被回收

    这篇文章主要介绍了JVM垃圾回收之哪些对象可以被回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-19
  • java jvm两种存储区的类型知识点讲解

    在本篇文章里小编给大家整理的是一篇关于java jvm两种存储区的类型知识点讲解内容,有兴趣的朋友们可以学习下。...2021-03-01
  • 一篇文章带你深入了解Java类加载

    这篇文章主要介绍了Java中类加载过程全面解析,具有一定参考价值,需要的朋友可以了解下,希望能给你带来帮助...2021-08-02
  • JVM钩子函数的使用场景详解

    当jvm进程退出的时候,或者受到了系统的中断信号,hook线程就会启动,一个线程可以注入多个钩,下面这篇文章主要给大家介绍了关于JVM钩子函数使用的相关资料,需要的朋友可以参考下...2021-08-23
  • 通过System.getProperty配置JVM系统属性

    这篇文章主要介绍了通过System.getProperty配置JVM系统属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-23