返回顶部
首页 > 资讯 > 精选 >什么是JVM的类加载器
  • 368
分享到

什么是JVM的类加载器

2023-06-16 08:06:06 368人浏览 薄情痞子
摘要

本篇内容主要讲解“什么是JVM的类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JVM的类加载器”吧!1. 什么是JVM既然是学习关于JVM的相关理论知识,我们当然得知道什么是JVM

本篇内容主要讲解“什么是JVM的类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JVM的类加载器”吧!

1. 什么是JVM

既然是学习关于JVM的相关理论知识,我们当然得知道什么是JVM。JVM是Java Virtual  Machine(Java虚拟机)的缩写。既然说到虚拟机,可能又会有人问什么是虚拟机了,我这里把虚拟机得相关概念放在这里:

  • 虚拟机:就是一台虚拟的计算机,他是一款软件;用来执行一系列计算机指令。虚拟机可以分为系统虚拟机和程序虚拟机。

  • 系统虚拟机:比如VMware,他们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。

程序虚拟机:比如Java虚拟机,它专门为执行单个计算机程序而设计。在Java虚拟机中执行的  指令我们称为Java字节码指令。(JVM是运行在操作系统之上的,它与硬件没有直接的交互)

所以根据定义,我们可以得知JVM是程序虚拟机。那么JVM在哪里呢,其实,我们在最开始学习Java得时候,都必须按照Java得运行环境,从网上下载jdk安装包,安装完成之后,在安装路径下会有两个文件夹,一个叫Jdk,一个叫jre,而java虚拟机就在jre的文件夹里面。

 存在即有他存在的道理,那么JVM的存在有什么用呢?他是用来干嘛的呢?学过JAVA的都知道,java程序要想运行,Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。而解释得这个过程就是通过Java虚拟机来执行的(可以参考下面这张图理解)。java虚拟机是来解释字节码文件的,而解释得这个过程其实是一个很复杂得过程,所以这就到了我们今天要讲得主题了。

什么是JVM的类加载器

2. 类加载(classLoading)

 我们先来了解一下类加载得整个过程。从下图可以看到类的生命周期一共分为5个阶段,加载、连接(包括验证、准备和解析)、初始化、使用(类得实例化)、卸载(垃圾回收)。

什么是JVM的类加载器

在Java代码中,我们都知道类(指的是类本身Class,比如,Interface,Enum)的加载、连接、初始化过程都是在程序运行期间完成的。下面我们就先讲一下类得加载、连接和初始化。

类的加载:*最常见的一种情况*是将已存在的类的Class文件(也就是字节码文件)从磁盘上面加载到内存里面,将其放在运行时数据区的方法区中,然后在内存中创建一个java.lang.Class对象用来封装类在方法区中的数据结构

类的连接(又细分了三个阶段):

  • 验证:确保被加载类的正确性

  • 准备:为类的静态变量(也可以称为类变量)分配内存,并将其初始化为默认值(比如int 的默认值就是0)

  • 解析:将类中的符号引用转换为直接引用

类的初始化:为类的静态变量进行赋值(从代码从上到下执行)

Java程序对类的使用方式可分为两种:

  • 主动使用

  • 被动使用

所有的Java虚拟机实现,在每个类或接口被Java程序"首次主动使用"时才初始化他们,一定要记住,是首次并且还是主动使用得时候才会初始化类。

如果对其类或者接口主动使用导致初始化了(此时的初始化就说明加载、连接(连接的三个步骤,注意,此时的连接只完成类的静态变量分配内存,并将其初始化为默认值)已经完成了)

我这里总结了7种主动使用:

  • 创建类的实例

  • 访问某个类或接口的静态变量,或者对该静态变量赋值

  • 调用类的静态方法

  • 反射(如class.forName())

  • 初始化一个类的子类

  • Java虚拟机启动时被表明为启动类的类

  • JDK1.7开始提高的动态语言支持;

除了以上7种情况,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化。

3. 类的加载连接初始化详细讲解

 其实我们知道类的加载的最终产品是位于内存中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

根据以上的总结,我们知道类的连接其实就是当类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行环境中去。那么类的验证的内容有哪些呢?

  • 类文件的结构检查

  • 语义检查

  • 字节码验证

  • 二进制兼容性的验证

什么是JVM的类加载器

4. 类加载器

 类的加载其实是类加载器去完成的,我们可以把类加载器想象成一个小人,帮助JVM干活的。那么类加载器的定义是什么呢,这里按照我个人的理解总结了一下:

类加载器(classLoader):类加载器是用来把类加载到Java虚拟机的内存空间中(加载类的工具,类一定是由类加载器去加载)。从JDK1.2版本开始,类的加载过程采用双亲委托机制。这种机制能更好的保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器之外(因为根类加载器本身是没有父加载器的),其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器完成加载任务,否则才有加载器loader1本身加载Sample类。

类加载器分为两种类型:

(1) Java虚拟机自带的加载器

  • 根类加载器(BootstrapClassLoader),也称启动类加载器

  • 扩展类加载器(ExtensionClassLoader)

  • 系统(应用)类加载器(SystemClassLoader或者AppClassLoader)

什么是JVM的类加载器

(2) 用户自定义的类加载器

  • java.lang.ClassLoader的子类(所有用户自定义的类加载器都应该继承抽象类ClassLoader类)

  • 用户可以定制类的加载方式

类加载器并不需要等到某个类被”首次主动使用“时再加载它

什么是JVM的类加载器

5. 类加载器双亲委托机制详解

 这一小节我们来详细了解一下类加载器的双亲委托机制。父亲委托机制也称为双亲委托机制(我个人得理解实际上应该叫做父亲委托机制,因为在源码里面是parent而不是parents):在父亲委托机制中,各个加载器按照父子关系形成了熟悉结构(逻辑上的,比如下图),除了启动类加载器之外,其余的类加载器都有且只有一个父加载器。

以下几种加载器从表面看是继承关系,实际上是包含关系哦

什么是JVM的类加载器

我举例来看看父亲委托机制的实际执行:

什么是JVM的类加载器

 对上图执行流程我详细得解释一下类加载器父亲委托机制具体是怎么执行得:首先loader1和loader2是我们自定义的加载器,loader1尝试去加载Sample类,根据父亲委托机制,其实并不是由loader1去直接加载Sample类到虚拟机当中,相反,它是把这个加载任务转交给系统类加载器去完成,系统类加载器再把这个加载任务转交给扩展类加载器,然后扩展类加载器再转交给根类加载器去完成,由于根类加载器已经是类加载器体系层次的最顶层,所以根类加载器会尝试去Sample类到虚拟机当中(然后根类加载器不能加载,因为他是从特定的几个目录去加载),既然根类加载器无法完成加载,他就会把这个任务返回给扩展类加载器(同理,原则上也不能加载),再让系统类加载器去加载(一般是可以加载成功)。最终再把这个流程返回给loader1,就宣告类加载过程结束。

6. 获取类加载器的几种途径

既然我们了解了类加载器的种类,那我们也需要了解通过什么方式可以获取到类加载器,获取类加载器的方式我这里总结了4种方式:

第一种:获得当前类的ClassLoader:

 clazz.getClassLoder()

具体实现如下所示:

Class<?> clazz1 = Class.forName("java.lang.String"); System.out.println(clazz1.getClassLoader());

第二种:获得当前线程上下文的ClassLoader:

 Thread.currentThread().getContextClassLoader();

具体实现如下所示:

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); System.out.println(contextClassLoader);

第三种:获得系统ClassLoader:

 ClassLoader.getSystemClassLoader();

第四种:获得调用者的ClassLoader

 DriverManager.getCallerLoader()

 我们还需要知道其实数组并不是由类加载器加载创建的的,而是当被需要时,被jvm运行时自动创建的,对于数组来说,他的类加载器是和他元素的类型的类加载一样的,如果元素类型是基本类型,则数组没有类加载器

ClassLoader类本身默认是并行加载的的(parallel  capable),如果子类想支持并行加载,是需要自己注册的,用户自定义加载器若需要并行加载,需要自行配置,通过调用reGISterAsParallelCapable()

到此,相信大家对“什么是JVM的类加载器”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 什么是JVM的类加载器

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

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

猜你喜欢
  • 什么是JVM的类加载器
    本篇内容主要讲解“什么是JVM的类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JVM的类加载器”吧!1. 什么是JVM既然是学习关于JVM的相关理论知识,我们当然得知道什么是JVM...
    99+
    2023-06-16
  • jvm类加载器,类加载机制是什么
    这篇文章主要介绍“jvm类加载器,类加载机制是什么”,在日常操作中,相信很多人在jvm类加载器,类加载机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm类加载器,类加载机制是什么”的疑惑有所帮助!...
    99+
    2023-06-16
  • JVM类加载过程是怎样的
    小编给大家分享一下JVM类加载过程是怎样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机...
    99+
    2023-06-02
  • Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么
    这篇“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”,小编整理...
    99+
    2023-06-06
  • 什么是类加载器
    本篇内容主要讲解“什么是类加载器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是类加载器”吧!类加载器简介Java程序被编译器编译之后成为字节码文件(.class文件),当程序需要某个类时,...
    99+
    2023-06-15
  • JVM入门之类加载与字节码技术(类加载与类的加载器)
    目录1. 类加载阶段1.1 加载阶段1.2 链接阶段准备1.3 初始化阶段1.4 练习2. 类加载器2.1 启动类加载器2.2 扩展类加载器2.3 双亲委派模式2.4 线程上下文类加...
    99+
    2024-04-02
  • JVM类加载机制过程以及原理是什么
    这篇文章主要介绍“JVM类加载机制过程以及原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JVM类加载机制过程以及原理是什么”文章能帮助大家解决问题。一、做一个小测试通过注释,标注出下面两个...
    99+
    2023-07-05
  • jvm中怎么加载一个类
    这篇文章将为大家详细讲解有关jvm中怎么加载一个类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  第一步:加载,双亲委派:启动类加载器(jre/lib),系统扩展类加载器(ext/lib)...
    99+
    2023-06-02
  • JVM核心之JVM运行和类加载
    这篇文章主要介绍了JVM核心之JVM运行和类加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关于JVM运行时数据区JVM运行时数据区关于类加载class文件加载至内存,链接...
    99+
    2023-05-30
    jvm
  • Java类加载器以及类加载器的委托模型是什么
    本篇内容介绍了“Java类加载器以及类加载器的委托模型是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道,我们在Java中用到的所...
    99+
    2023-06-17
  • JVM类加载,垃圾回收
    目录类加载子系统双亲委派模型垃圾回收判断对象已死JDK1.2之后的四种引用类型:1.强引用:2.软引用:3.弱引用:4.虚引用:常见的垃圾回收算法:1.标记–清除算法:(Mark–S...
    99+
    2024-04-02
  • JVM中ClassLoader类加载器的深入理解
    JVM的体系结构图 先来看一下JVM的体系结构,如下图: JVM的位置 JVM的位置,如下图: JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JI...
    99+
    2024-04-02
  • JVM类加载器之ClassLoader的使用详解
    目录类加载器概述加载器的种类验证不同加载器核心方法JVM类加载机制的三种方式全盘负责父类委托、双亲委派缓存机制打破双亲委派重写loadclass方法自定义类加载器准备字节码文件创建自...
    99+
    2022-11-13
    JVM类加载器ClassLoader JVM类加载器 类加载器ClassLoader
  • Java类加载器的特色是什么
    这篇文章主要介绍“Java类加载器的特色是什么”,在日常操作中,相信很多人在Java类加载器的特色是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java类加载器的特色是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-15
  • jvm类加载机制怎么实现
    JVM类加载机制是通过类加载器来实现的。类加载器负责在JVM运行时将字节码文件加载到内存中,并将其转换为可执行的类。类加载器主要分为...
    99+
    2024-04-02
  • JVM的类加载过程有哪些
    这篇文章给大家介绍JVM的类加载过程有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、基础知识我们平时写的Java写代码一般都是.java文件,编译成为.class字节码文件,然后类加载器把.class文件加载到...
    99+
    2023-06-15
  • Final关键字对JVM类加载器的影响是怎样的
    这篇文章将为大家详细讲解有关Final关键字对JVM类加载器的影响是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。当一个类中有声明为static final的变量,这样的变量对类的加载...
    99+
    2023-06-17
  • JVM加载class文件的原理机制是什么
    今天小编给大家分享一下JVM加载class文件的原理机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、JVM简介J...
    99+
    2023-06-30
  • Java JVM类加载机制解读
    目录1.什么是类加载2.类加载的过程2.1加载2.2验证2.3准备2.4解析2.5初始化【重中之重之重中重】第一段代码:第二段代码:第三段代码:最后一段代码:总结1.什么是类加载 首...
    99+
    2024-04-02
  • JVM的类加载过程详细说明
    目录一、基础知识二、加载三、验证四、准备五、解析六、核心阶段:初始化七、双亲委派机制八、总结一、基础知识 我们平时写的Java写代码一般都是.java文件,编译成为.class字节码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作