JVM的类加载机制

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

1、概述:JVM是Java语言实现跨平台的关键,Java语言的运行过程:

        *.java通过编译器编译为*.class,通用字节码文件并不能直接被操作系统所识别,针对不同的操作系统可安装对应的JVM,JVM将字节码解释为当前平台所能识别的机器码实现“跨平台”。

JVM执行class文件的方式:解释为主,编译为辅

解释:将字节码解释为操作系统能识别的机器码

编译:对于出现次数较多的“热点”指令直接编译为机器码存储在缓存中(JIT)

2、JVM的组成结构

JVM由类加载器、运行时数据区域、执行引擎、本地方法接口四部分组成

JVM的类加载机制,jvm

3、类加载过程

JVM要将字节码解释为机器码,首当其冲需要将字节码加载到JVM内存中,这个过程叫做类加载。

类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段::加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。

JVM的类加载机制,jvm

第一步:加载(三件事)

        一、根据完全限定名读取二进制字节流

        二、将字节流所代表的静态存储结构转换为方法区(元空间)的运行时数据结构

        三、生成类的 Class 对象,作为方法区各种数据的访问入口。

第二步:验证——验证字节码中字节流信息是否符合当前JVM要求,并不会危害JVM的自身安全

第三步:准备——为类变量分配内存并设置初始化值

第四步:解析——将常量池符合引用替换为直接引用

第五步:初始化——执行<clinit>(包含静态变量赋值与静态代码块)

        注意:定义在静态代码块之后的类变量,只能赋值,不能访问

经历上述5个步骤后,类已经被加载至JVM内存中。那么在什么情况下一个类会被加载呢? 

4、类加载时机

      触发类加载的常见场景有以下5种情况:

一、new一个对象、访问类变量、为类变量赋值、调用类方法(new、getstatic、putstatic、  invokestatic指令)

二、对类的反射调用(Class.forName()或newInstance()

三、预加载类的父类未加载时,先加载父类

四、程序入口方法所在类会加载

五、接口中定义了默认方法,在实现类加载前会先加载接口

注意:接口中虽无法定义静态代码块,但仍有静态变量的存在,与类不同的是,接口的类加载不会触发父接口的类加载,只有在使用到了父接口才会对父接口类加载,同样实现类也一样,未使用父接口中的资源时不加载父接口(定义了默认方法的接口例外)

        同样也有几种场景情况下不会进行类加载需要我们了解,以免混淆

一、通过子类引用访问父类的类变量,子类不加载

二、数组定义的引用类,不触发类加载,JVM会将数组类自动生成为Object的子类

三、常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的加载。

类加载的过程已经何时会进行类加载我们已经了解了,那么谁来执行类加载呢,它需要依靠一个叫类加载器的结构完成这一步骤,类加载器属于前面JVM组成接口的一部分。

5、类加载器——执行类加载

类加载器针对加载类不同分为3大类:

        一、启动类加载器(Bootstrap ClassLoader):加载基础、核心类库

        二、扩展类加载器(Extension ClassLoader):加载扩展类库,父类加载器为Bootstrap ClassLoader

        三、应用程序类加载器/系统类(Bootstrap ClassLoader):加载自定义类与第三方jar包类库,父类加载器为Extension ClassLoader

这三个类加载它们各司其职,但存在层次结构关系,类加载器之间的层次关系被称为双亲委派模型

双亲委派模型的工作原理类加载器首先会将类加载请求转发至父类加载器,若父类加载器完成不了时,它才会自行加载。

这样干究竟有什么目的?

例如:java.util.lang包下有一个Object类(存放在rt.jar【由启动类加载器加载】),我们同样自定义了一个java.util.lang包下的Object类放到 ClassPath 中(由应用程序类加载器加载)。由于rt.jar 中的 Object 优先级更高,那么程序中使用的所有的 Object 都是由启动类加载器所加载的Object。

作用:使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一,避免冲突文章来源地址https://www.toymoban.com/news/detail-733237.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日
    浏览(46)
  • 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日
    浏览(59)
  • 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日
    浏览(44)
  • JVM:类加载机制

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包