JVM的类加载的过程以及双亲委派模型

这篇具有很好参考价值的文章主要介绍了JVM的类加载的过程以及双亲委派模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、加载 (加载字节码文件,生成.class对象)

2、验证(验证Class文件是否符合规范) 

3、准备 (为静态变量分配内存并设置变量初始值)

4、解析(初始化常量池中的一些常量) 

5、初始化(初始化对象,并为静态变量赋值) 

总结:

双亲委派模型:  

JVM的类加载器(主要有3个): 

标准库中的String类是怎样被加载的? 

自定义的类如何加载? 

类加载一定要使用双亲委派模型吗? 

为什么Tomcat不使用双亲委派模型? 

Tomcat是怎么实现webapps下各个web应用程序的隔离的?


类加载过程简单来说就是把.class文件加载到内存中构造出类对象 

JVM的类加载过程要经历以下几个阶段:加载->连接->初始化 

其中连接阶段可以细分成:验证->准备->解析

所以也可以说JVM的类加载过程是这几个阶段: 加载->验证->准备->解析->初始化

1、加载 (加载字节码文件,生成.class对象)

首先要进行加载的过程。加载过程就是要找到.class文件,打开并读取它。在这个过程中要先从.class文件中获取到这个类的二进制字节流,然后将这个字节流代表的静态存储结构转化为方法运行时的数据结构,最后在内存中生成一个代表该类的java.long.Class对象,然后把这个放到方法区,作为该类的数据访问接口。 

二进制的.class文件包含内容:

JVM的类加载的过程以及双亲委派模型

详情见Java虚拟机规范手册:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html 

2、验证(验证Class文件是否符合规范) 

在进行读取前,要先验证Class文件字节流中包含的信息是否符合Java虚拟机规范的约束条件, 验证的内容包括:文件格式,字节码,符号引用

3、准备 (为静态变量分配内存并设置变量初始值)

准备阶段是正式为类中的属性(static修饰的变量)分配内存和进行初始值的设定

如:public static int num=123;在准备阶段并不会对num进行赋值123,而是先设定num=0;

4、解析(初始化常量池中的一些常量) 

前面我们说到.class文件中包含的内容,在这一阶段,JVM会将符号引用转化为直接引用,也就是在这一阶段,会对常量进行一个初始化。

5、初始化(初始化对象,并为静态变量赋值) 

在这一阶段,Java虚拟机开始真正的执行类中的代码,进行对象的初始化,并且为静态变量赋值,比如前面的 num 就会在这一阶段被赋值为123,而不是原来的0了。

总结:

JVM的类加载的过程以及双亲委派模型

双亲委派模型:  

双亲委派模型属于一种类加载的机制。

前面我们说到了类加载的过程经历了加载-> 连接->初始化的过程。其中加载的过程是加载字节码文件,生成.class对象。在这个加载的过程中类加载器发挥着至关重要的作用,而双亲委派模型就是描述类加载器是如何根据全限定名(类名+包名,如java.long.String)找到.class文件的过程,这个过程属于加载过程的靠前的阶段。

JVM的类加载器(主要有3个): 

JVM的类加载器主要是下面这3个:

BootSharpClassLoader(负责加载标准库当中的类(如List,String))

ExtensionClassLoader(负责加载JDK扩展库当中的类)

ApplicationClassLoader(负责加载当前目录当中的类) 

除此之外,用户也可以自定义类加载器:User-DefinedClassLoader,一般没有使用自定义加载器,所以默认就是上面的那3种类加载器。每个类加载器负责加载自己负责的目录。 

下图来源于博客: JVM类加载器-CSDN博客

JVM的类加载的过程以及双亲委派模型

双亲委派模型就是描述了上述的类加载器之间是怎么配合的 。

例子(没有自定义类加载器):

标准库中的String类是怎样被加载的? 

第一步:程序启动,进入ApplicationClassLoader类加载器

第二步:在ApplicationClassLoader中检查其父类加载器ExtensionClassLoader是否被加载过,如果没有加载过就进入到ExtensionClassLoader中

第三步:在ExtensionClassLoader中检查最高父类加载器BootSharpClassLoader是否加载过,没有就进入BootSharpClassLoader中。 

最后在BootSharpClassLoader中查找标准库的目录:java.long.String,完成String的加载。

JVM的类加载的过程以及双亲委派模型

自定义的类如何加载? 

如果是自定义的类,也会经历上述过程,但是由于在BootSharpClassLoader目录中无法找到该自定义的类就会回到上一级ExtensionClassLoader中进行加载,如果还是找不到就会到上一级ApplicationClassLoader当中进行加载,然后再当前目录中找到了自定义的类进行加载。

JVM的类加载的过程以及双亲委派模型

 如果在最后没有成功加载就会抛出ClassNotFoundException。

双亲委派模型的优势:

当用户自定义的类与标准库中的类的全限定名重复了,依然可以准确的加载标准库中的类,而不是自定义的类,比如自定义一个和标准库中的java.long.String的一样的类,当类加载器加载到BootSharpClassLoader的时候就不会再返回了,就加载的是标准库中的类。  

类加载一定要使用双亲委派模型吗? 

不一定,因为双亲委派模型只是类加载机制中的一种,是适用于JVM的类加载的,而像Tomcat加载webapps中的类则没有使用双亲委派模型。

为什么Tomcat不使用双亲委派模型? 

首先Tomcat中的webapps下面有很多的web应用程序。

第一个原因:隔离性,为了保证每个web应用程序之间互不干扰,可以相互独立互不干扰的加载和销毁各自的类,不会因为web程序因为重名或者版本不同等原因造成冲突。

第二个原因:方便动态的重新加载已经加载过的类,使得开发和部署的效率更高。 

Tomcat是怎么实现webapps下各个web应用程序的隔离的?

Tomcat自定义了一个webapp类加载器,并且给每一个web应用程序都创建一个类加载器,所以不同的类加载器加载的就是不同的类了。 文章来源地址https://www.toymoban.com/news/detail-419034.html

到了这里,关于JVM的类加载的过程以及双亲委派模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM:双亲委派机制&类加载器

    Java运行时环境有一个 java.lang 包,里面有一个 ClassLoader 类 我们自定义一个 String 类在 java.lang 包下,下面的main方法报错。原因是: 根据双亲委派机制,会向上找先是找到了 应用程序加载器(appClassLoader) ,然后向上找 扩展类加载器(ExtClassLoader) ,最后找 根类加载器(Boot Strap

    2024年02月01日
    浏览(37)
  • JVM类加载和双亲委派机制

    当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把类加载到JVM,本文主要说明类加载机制和其具体实现双亲委派模式。 类加载过程 : 类加载的过程是将类的字节码加载到内存中的过程,主要包括:加载--链接--初始化,其中链接还包括验证、准备、

    2024年02月09日
    浏览(46)
  • 【JAVA基础】JVM之类加载--双亲委派机制

    1. 类加载的过程 描述: 我们写的 .java 文件通过编译成字节码文件 .class 文件,然后再通过我们的类加载器:Class Loader,反射以后,类模板存在方法区,把实例化的对象存在堆里; 看图: 对象的hashcode值 解释: 从图中我们可以看出,从同一个类模板new出来三个对象(实例化

    2024年01月23日
    浏览(45)
  • Java JVM类加载阶段 双亲委派模式

    加载 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有: _java_mirror 即 java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴露给 java 使用 _super 即父类 _fields 即成员变量 _methods 即方法 _constants 即常量池 _class_loader 即类加载器

    2024年01月25日
    浏览(46)
  • JVM(类的加载与ClassLoader、双亲委派机制)

    类在内存中完整的生命周期: 加载--使用--卸载 。其中加载过程又分为: 装载、链接、初始化 三个阶段。 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、链接、初始化三个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成这三个步骤,

    2024年02月03日
    浏览(48)
  • 【JVM从入门到实战】(六)类加载器的双亲委派机制

    在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。 双亲委派机制: 自底向上查找是否加载过,再由顶向下进行加载 面试题:

    2024年02月04日
    浏览(49)
  • java八股文面试[JVM]——双亲委派模型

    1.当 AppClassLoader 去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器 ExtClassLoader 去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载器 BootstrapClassLoader 去完成。 3.如果BootstrapClas

    2024年02月11日
    浏览(57)
  • [JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他

    JDK1.8及之前和JDK9及之后的双亲委派模型是不一样的,这里学习了1.8及以前的双亲委派模型,记录笔记 1.8之前主要是这几种类加载器: 负责将存放在 JAVA_HOMElib 目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名,如rt.jar)类库加载到虚

    2024年02月16日
    浏览(49)
  • 解析Java类加载的运行机制和双亲委派模型

    类加载形如把.class文件,加载到内存中,得到类对象这样的过程 类加载一共分为五个步骤: 加载 验证 准备 解析 初始化 加载 类加载的第一步是将编译好的 Java 类的字节码文件加载到 Java 虚拟机(JVM)中。类加载器会根据类的名称找到对应的字节码文件,并将其读取到内存

    2024年02月15日
    浏览(42)
  • 深入理解Java类加载机制中的双亲委派模型--根据源码探讨

    前言: 今天和大家探讨一道Java中经典的面试题,这道面试题经常出现在各个公司的面试中,本篇文章主要讲解 ava类加载机制中的双亲委派模型 的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助

    2024年02月14日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包