JVM 的类加载机制

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

JVM 的类加载机制

类加载就是把 .class 文件加载到内存中,得到 类对象 的过程。


类加载的 5 个过程

1 加载

找到 .class 文件,将文件内容读取到内存中。

2 验证

验证加载的这个文件是否合法的 .class文件,.class 文件有明确的数据格式。

3 准备

给类对象分配内存空间,定义成员变量。

未初始化的空间,内存空间中的数据是全 0 的。

例如: public static int value = 100;

此时这个成员变量的值为 0,而不是 100。

4 解析

针对字符串常量进行初始化。

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

常量池内的符号引用替换为直接引用:

字符串常量在 .class 文件中就存在了,但是它们只是知道彼此之间的相对位置(偏移量),这个时候的字符串常量就算符号引用。

加载到内存中后,字符串常量就填充到内存中,字符串常量之间的相对位置还是一样,但是这些字符串常量有了自己的内存地址,此时的字符串就算直接引用(Java 中的普通引用)。

5 初始化

针对类对象进行初始化(初始化静态成员,执行静态代码块,加载父类…)


什么时候进行类加载?

懒加载” 的策略,非必要,不加载。

  1. 创建类的实例,会加载这个类

  2. 使用了某个类的静态属性/静态方法

  3. 加载一个子类,会触发父类的加载


双亲委派模型

双亲委派模型所做的事,就是在 加载 步骤中,寻找 .class 文件。

在 JVM 中,加载类,需要用到一组特殊的模块,类加载器。

JVM 中,内置了三个类加载器:

  1. BootStrap ClassLoader 负责加载 Java 标准库中的类

  2. Extension ClassLoader 负责加载一些非标准的 Sum/ Oracle 扩展库中的类

  3. Application ClassLoader 负责加载项目中自己写的类 以及 第三方库中的类

这三个加载器有父子关系,Application ClassLoader 的父亲加载器是 Extension ClassLoader,Extension ClassLoader 的父亲加载器的 BootStrap ClassLoader。

寻找 .class 文件的过程:

加载一个类的时候,要先通过全限定类名,如 “java.lang.String",来寻找这个 .class 文件。

先从 Application ClassLoader 加载器开始,但是不能直接开始搜索,会先交给父亲加载器 Extension ClassLoader 去找。等收到父亲加载器的反馈后,自己才开始搜索,如果搜索到了直接进行后续的加载步骤,如果没有搜索到,就抛出 ClassNotFuoundException

Extension ClassLoader 也不能直接开始搜索,也会先交给自己的父亲加载器 BootStrap ClassLoader 去找。等收到父亲加载器的反馈后,自己才开始搜索,如果搜索到了,就直接进行后续的加载步骤,如果没有搜索到就交给孩子加载器。

BootStrap ClassLoader 没有父亲加载器了,就自己来搜索,搜索到了就直接进行后续的加载步骤,如果没有搜索到再交给孩子加载器。

总结: 搜索一个 .class 文件,先从 Application ClassLoader 加载器开始,然后每个加载器都会先交给自己的父亲加载器去搜索,父亲加载器搜索不到,自己才会开始搜索,如果 Application ClassLoader 也搜索不到,就会抛出 ClassNotFuoundException。文章来源地址https://www.toymoban.com/news/detail-555275.html


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

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

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

相关文章

  • JVM类加载机制-JVM(一)

    我们运行一个.class文件,windows下的java.exe调用底层jvm.dll文件创建java虚拟机(c++实现)。 创建一个引导类加载器实例(c++实现) C++调用java代码Launcher,该类创建其他java类加载器。 Launcher.getClassLoader()调用loaderClass加载运行类Math classLoader.loader(“com.jvm.math”)加载main方法入口

    2024年02月12日
    浏览(44)
  • JVM基础(1)——JVM类加载机制

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年02月02日
    浏览(50)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(57)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(41)
  • JVM类加载机制(六)

    类加载器(ClassLoader)是 Java 虚拟机(JVM)的重要组成部分,负责将类的字节码加载到内存中并转换为可执行的 Java 类。类加载器的主要任务是根据类的名称查找字节码文件并加载到内存中,然后进行验证、准备和解析等操作,最终生成可执行的类。 类加载器的分类: 启动类

    2024年02月06日
    浏览(51)
  • JVM:类加载机制

    Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历 加载、验证

    2024年01月17日
    浏览(86)
  • JVM类加载机制

    自己编写的Java代码,是如何在各种各样的操作系统上运行起来的? Java文件通过javac编译成class文件,这种中间码被称为字节码,然后由jvm加载字节码,运行时解释器将字节码解释为一行行机器码来执行,在程序运行期间,即时编译器能会针对热点代码将该部分字节码编译成机

    2024年02月10日
    浏览(36)
  • JVM:Java类加载机制

            加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始, 这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑定)。

    2024年01月21日
    浏览(36)
  • 说一下JVM类加载机制?

    Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。 在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的

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

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

    2024年02月09日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包