iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >jvm类加载器,类加载机制是什么
  • 636
分享到

jvm类加载器,类加载机制是什么

2023-06-16 01:06:04 636人浏览 薄情痞子
摘要

这篇文章主要介绍“JVM类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!

这篇文章主要介绍“JVM类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java代码执行流程图

大家通过这个流程图,了解一下我们写好的Java代码是如何执行的,其中要经历类加载器这个流程,我们就来仔细讲讲这里面的知识点。

jvm类加载器,类加载机制是什么

类加载子系统

jvm类加载器,类加载机制是什么

类加载系统架构图

暂时看不懂这两张图没关系,跟着老哥往下看

jvm类加载器,类加载机制是什么

类的生命周期

类的生命周期包括:加载、链接、初始化、使用和卸载,其中加载、链接、初始化,属于类加载的过程,我们下面仔细讲解。使用是指我们new对象进行使用,卸载指对象被垃圾回收掉了。

类加载的过程

jvm类加载器,类加载机制是什么

  •     第一步:Loading加载

通过类的全限定名(包名 + 类名),获取到该类的.class文件的二进制字节流

将二进制字节流所代表的静态存储结构,转化为方法区运行时的数据结构

在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

总结:加载二进制数据到内存 —> 映射成jvm能识别的结构 —> 在内存中生成class文件。

  •  第二步:Linking链接

链接是指将上面创建好的class类合并至Java虚拟机中,使之能够执行的过程,可分为验证、准备、解析三个阶段。

① 验证(Verify)

确保class文件中的字节流包含的信息,符合当前虚拟机的要求,保证这个被加载的class类的正确性,不会危害到虚拟机的安全

② 准备(Prepare)

为类中的静态字段分配内存,并设置默认的初始值,比如int类型初始值是0。被final修饰的static字段不会设置,因为final在编译的时候就分配了

③ 解析(Resolve)

解析阶段的目的,是将常量池内的符号引用转换为直接引用的过程(将常量池内的符号引用解析成为实际引用)。如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载(但未必触发这个类的链接以及初始化。)

事实上,解析器操作往往会伴随着 JVM 在执行完初始化之后再执行。 符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《Java 虚拟机规范》的Class文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

解析动作主要针对类、接口、字段、类方法、接口方法、方法类型等。对应常量池中的 CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。

  •  第三步:initialization初始化

初始化就是执行类的构造器方法init()的过程。

这个方法不需要定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并来的。

若该类具有父类,jvm会保证父类的init先执行,然后在执行子类的init。

类加载器的分类

jvm类加载器,类加载机制是什么

  •  第一个:启动类/引导类:Bootstrap ClassLoader

这个类加载器使用C/C++语言实现的,嵌套在JVM内部,java程序无法直接操作这个类。

它用来加载Java核心类库,如:JAVA_HOME/jre/lib/rt.jar、resources.jar、sun.boot.class.path路径下的包,用于提供jvm运行所需的包。

并不是继承自java.lang.ClassLoader,它没有父类加载器

它加载扩展类加载器和应用程序类加载器,并成为他们的父类加载器

出于安全考虑,启动类只加载包名为:java、javax、sun开头的类

  •  第二个:扩展类加载器:Extension ClassLoader

Java语言编写,由sun.misc.Launcher$ExtClassLoader实现,我们可以用Java程序操作这个加载器

派生继承自java.lang.ClassLoader,父类加载器为启动类加载器

从系统属性:java.ext.dirs目录中加载类库,或者从jdk安装目录:jre/lib/ext目录下加载类库。我们就可以将我们自己的包放在以上目录下,就会自动加载进来了。

  • 第三个:应用程序类加载器:Application Classloader

Java语言编写,由sun.misc.Launcher$AppClassLoader实现。

派生继承自java.lang.ClassLoader,父类加载器为启动类加载器

它负责加载环境变量classpath或者系统属性java.class.path指定路径下的类库

它是程序中默认的类加载器,我们Java程序中的类,都是由它加载完成的。

我们可以通过ClassLoader#getSystemClassLoader()获取并操作这个加载器

  • 第四个:自定义加载器

一般情况下,以上3种加载器能满足我们日常的开发工作,不满足时,我们还可以自定义加载器

比如用网络加载Java类,为了保证传输中的安全性,采用了加密操作,那么以上3种加载器就无法加载这个类,这时候就需要自定义加载器

自定义加载器实现步骤

继承java.lang.ClassLoader类,重写findClass()方法

如果没有太复杂的需求,可以直接继承URLClassLoader类,重写loadClass方法,具体可参考AppClassLoader和ExtClassLoader。

获取ClassLoader几种方式

它是一个抽象类,其后所有的类加载器继承自 ClassLoader(不包括启动类加载器)

// 方式一:获取当前类的 ClassLoader  clazz.getClassLoader()  // 方式二:获取当前线程上下文的 ClassLoader  Thread.currentThread().getContextClassLoader()  // 方式三:获取系统的 ClassLoader  ClassLoader.getSystemClassLoader()  // 方式四:获取调用者的 ClassLoader  DriverManager.getCallerClassLoader()

类加载机制—双亲委派机制

jvm对class文件采用的是按需加载的方式,当需要使用该类时,jvm才会将它的class文件加载到内存中产生class对象。

在加载类的时候,是采用的双亲委派机制,即把请求交给父类处理的一种任务委派模式。

jvm类加载器,类加载机制是什么

  •  工作原理

(1)如果一个类加载器接收到了类加载的请求,它自己不会先去加载,会把这个请求委托给父类加载器去执行。

(2)如果父类还存在父类加载器,则继续向上委托,一直委托到启动类加载器:Bootstrap ClassLoader

(3)如果父类加载器可以完成加载任务,就返回成功结果,如果父类加载失败,就由子类自己去尝试加载,如果子类加载失败就会抛出ClassNotFoundException异常,这就是双亲委派模式

  •  第三方包加载方式:反向委派机制

在Java应用中存在着很多服务提供者接口(Service Provider Interface,SPI),这些接口允许第三方为它们提供实现,如常见的 SPI 有 JDBC、JNDI等,这些 SPI 的接口属于 Java 核心库,一般存在rt.jar包中,由Bootstrap类加载器加载。而Bootstrap类加载器无法直接加载SPI的实现类,同时由于双亲委派模式的存在,Bootstrap类加载器也无法反向委托AppClassLoader加载器SPI的实现类。在这种情况下,我们就需要一种特殊的类加载器来加载第三方的类库,而线程上下文类加载器(双亲委派模型的破坏者)就是很好的选择。

从图可知rt.jar核心包是有Bootstrap类加载器加载的,其内包含SPI核心接口类,由于SPI中的类经常需要调用外部实现类的方法,而jdbc.jar包含外部实现类(jdbc.jar存在于classpath路径)无法通过Bootstrap类加载器加载,因此只能委派线程上下文类加载器把jdbc.jar中的实现类加载到内存以便SPI相关类使用。显然这种线程上下文类加载器的加载方式破坏了“双亲委派模型”,它在执行过程中抛弃双亲委派加载链模式,使程序可以逆向使用类加载器,当然这也使得Java类加载器变得更加灵活。

jvm类加载器,类加载机制是什么

  •  沙箱安全机制

自定义 String 类,但是在加载自定义 String 类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载 JDK 自带的文件(rt.jar 包中的 javalangString.class),报错信息说没有 main 方法就是因为加载的 rt.jar 包中的 String 类。这样可以保证对 Java 核心源代码的保护,这就是沙箱安全机制。

到此,关于“jvm类加载器,类加载机制是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: jvm类加载器,类加载机制是什么

本文链接: http://www.lsjlt.com/news/282069.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • jvm类加载器,类加载机制是什么
    这篇文章主要介绍“jvm类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!...
    99+
    2023-06-16
  • 什么是JVM的类加载器
    本篇内容主要讲解“什么是JVM的类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JVM的类加载器”吧!1. 什么是JVM既然是学习关于JVM的相关理论知识,我们当然得知道什么是JVM...
    99+
    2023-06-16
  • Java JVM类加载机制解读
    目录1.什么是类加载2.类加载的过程2.1加载2.2验证2.3准备2.4解析2.5初始化【重中之重之重中重】第一段代码:第二段代码:第三段代码:最后一段代码:总结1.什么是类加载 首...
    99+
    2024-04-02
  • jvm类加载机制怎么实现
    JVM类加载机制是通过类加载器来实现的。类加载器负责在JVM运行时将字节码文件加载到内存中,并将其转换为可执行的类。类加载器主要分为...
    99+
    2024-04-02
  • tomcat类加载机制是什么
    Tomcat的类加载机制是指Tomcat服务器在运行过程中,如何加载和管理Java类文件的过程。它主要包括以下几个步骤:1. Boo...
    99+
    2023-09-15
    tomcat
  • 详细分析JVM类加载机制
    目录前言1. jvm 的组成2. 类加载1. 加载  2. 链接3. 初始化3. 类加载器引导类加载器(启动类加载器)扩展类加载器应用程序类加载器4. 双亲委派机...
    99+
    2024-04-02
  • JVM类加载机制过程以及原理是什么
    这篇文章主要介绍“JVM类加载机制过程以及原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JVM类加载机制过程以及原理是什么”文章能帮助大家解决问题。一、做一个小测试通过注释,标注出下面两个...
    99+
    2023-07-05
  • jvm虚拟机类加载机制详解
    目录1 概述2 类的加载时机3 类的加载过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化4 类加载器4.1 双亲委派模型4.2 破坏双亲委派模型1 概述 ​ Jav...
    99+
    2024-04-02
  • Java类的加载机制是什么
    这篇文章主要讲解了“Java类的加载机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类的加载机制是什么”吧!1、什么是类的加载类的加载指的是将类的.class文件中的二进制数...
    99+
    2023-06-17
  • spring类的加载机制是什么
    Spring框架的类加载机制主要涉及到两个方面:类路径扫描和类加载器。 类路径扫描:Spring框架在启动时会扫描应用程序的类路...
    99+
    2024-04-02
  • JVM分析之类加载机制详解
    目录1、前言2、类加载是什么3、类加载过程3.1 加载3.2 链接3.3 初始化4、总结1、前言 JVM内部架构包含类加载器、内存区域、执行引擎等。日常开发中,我们编写的java文件...
    99+
    2022-11-13
    JVM类加载机制 JVM类加载
  • 聊一聊Java的JVM类加载机制
    目录加载(Loading)连接(Linking)初始化(Initialization)类初始化的时机总结Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换...
    99+
    2023-05-16
    Java JVM JVM类加载机制
  • JVM入门之类加载与字节码技术(类加载与类的加载器)
    目录1. 类加载阶段1.1 加载阶段1.2 链接阶段准备1.3 初始化阶段1.4 练习2. 类加载器2.1 启动类加载器2.2 扩展类加载器2.3 双亲委派模式2.4 线程上下文类加...
    99+
    2024-04-02
  • JVM【类加载与GC垃圾回收机制】
    JVM【类加载与GC垃圾回收机制】 🍎一.JVM🍒1.1JVM简介🍒1.2JVM执行流程 🍎二.JVM运行时数据区...
    99+
    2023-09-06
    jvm java 开发语言
  • 什么是类加载器
    本篇内容主要讲解“什么是类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是类加载器”吧!类加载器简介Java程序被编译器编译之后成为字节码文件(.class文件),当程序需要某个类时,...
    99+
    2023-06-15
  • 好程序员Java分享JVM类加载机制
    JVM相关概念jdk<br>jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合。jre<br>jre(Java Runtime Evironment...
    99+
    2023-06-02
  • Java虚拟机JVM类加载机制(从类文件到虚拟机)
    目录一、类加载机制简介二、类加载机制过程 2.1、加载(Load)2.2、连接(Linking)2.3、初始化(Initialize)三、类加载器Classloader&n...
    99+
    2024-04-02
  • 如何处理JVM类加载机制及类缓存问题
    这篇文章给大家分享的是有关如何处理JVM类加载机制及类缓存问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言大家应该都知道,当一个Java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对cla...
    99+
    2023-05-30
  • JVM类加载过程是怎样的
    小编给大家分享一下JVM类加载过程是怎样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机...
    99+
    2023-06-02
  • jvm中怎么加载一个类
    这篇文章将为大家详细讲解有关jvm中怎么加载一个类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  第一步:加载,双亲委派:启动类加载器(jre/lib),系统扩展类加载器(ext/lib)...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作