解析JVM类加载器

news2024/11/28 15:51:26

文章目录

      • 1、何为类加载器
      • 2、三层类加载器
      • 3、双亲委派模型

参考资料:《深入理解Java虚拟机》

1、何为类加载器

类加载过程中,加载阶段第一步操作就是通过一个类的全限定名获取此类的二进制字节流。实现这个动作的代码就是类加载器

任意一个类都必须由加载它的类加载器和这个类本身共同确定类在JVM中的唯一性,每个类加载器都拥有独立的类名称空间;所以即使两个类来自于同一个Class文件,被同一个JVM加载,只要加载它们的类加载器不同,这两个类就必定不相等。

站在Java虚拟机角度来看,只存在两种不同的类加载器:

  1. 启动类加载器(Bootstrap ClassLoader):C++语言实现,是虚拟机一部分
  2. 其他所有的类加载器:Java语言实现,独立存在于虚拟机外部,全部继承于抽象类java.lang.ClassLoader

2、三层类加载器

JDK9之前,绝大多数Java应用都会使用一下三个系统提供的类加载器进行加载:
在这里插入图片描述

  1. 启动类加载器(Bootstrap Class Loader):负载加载存放JAVA_HOME\lib目录,或者被-Xbootclasspath参数所指定的路径中存放的类加载到JVM内存中。启动类加载器无法被Java程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,那直接使用null代替即可。
  2. 扩展类加载器(Extension Class Loader):该加载器是在类sun.misc.Launcher$ExtClassLoader中Java代码的形式实现的。负责加载JAVA_HOME\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中所有的类库。JDK开发团队允许用户将具有通用性的类库放置在ext目录里,以拓展Java
    SE的能力。
  3. 应用类加载器(Application Class Loader):该加载器是在类sun.misc.Launcher$AppClassLoader来实现。负责加载用户类路径ClassPath上所有的类库。如果应用程序中没有自定义类加载器,那么它就是程序默认的类加载器。

当然还可以加入自定义类加载器进行拓展,例如:

  • 增加除磁盘位置之外的Class文件来源
  • 通过类加载器实现类的隔离、重载等功能

3、双亲委派模型

第2节中的图片被称作双亲委派模型

双亲委派模型的工作过程

如果一个类加载器收到类加载的请求,它首先不会自己尝试加载,而是把这个请求向上委派给父类加载器,每一层都是如此(孔融让梨);因此所有的加载请求最终应该传送到最顶层的启动类加载器中,只有当父加载器反馈无法完成本次加载请求,子加载器才会尝试加载。

使用双亲委派模型的好处

Java中的类随着它的类加载器具备了优先级的层次关系。例如java.lang.Object类存放在tr.jar中,无论哪个类加载器要加载这个类,最终都是委派给最上层的启动类加载器进行加载,因此Object类在各种类加载器环境中都能保证是同一个类。
反之,没有双亲委派模型,用户编写java.lang.Object类放在ClassPath中,这样系统会出现不同的Object类,会变得一片混乱。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis-plus1(前言技术)

目录 一、Mybatis-plus入门 1.什么是mybatis-plus 2.初体验 ① 准备数据库脚本 ② 初始化工程 ③ 编码 ④ 开始使用 3.日志 二、Mybatis-plus主键生成策略 1.更新 三、Mybatis-plus自动填充 1:通过数据库完成自动填充 2:使用程序完成自…

gensim中的word2vec使用

介绍 一句话,GensimGensimGensim中的word2vec类就是用来训练词向量的,这个类实现了词向量训练的两种基本模型skip−gramskip-gramskip−gram和CBOWCBOWCBOW,可以通过后面的参数设置来选择,。但是,在Gensim这个模块中训练词向量的…

什么是盒子模型?

什么是盒子模型? 盒子模型组成有 4 部分,分别为:内容 内边距 外边距(一般不计入盒子实际宽度) 边框 盒子模型有 2 种:标准盒子模型与怪异盒子模型 标准盒子模型content(内容)border(边框)padding(内边距) 怪异盒子模型content(内容)(已经包含了 padding 和 border) …

随手查——Lumerical

Lumerical小白学习的一些记录,以防自己忘记,持续更。。。 快速导航1、如何设置网格2、关于窗口的一些操作(1)窗口的最大化与复原(2)窗口的关闭与开启1、如何设置网格 【View】→【Drawing grid】→【Edit …

ctfshow代码审计篇

文章目录web301-SQL注入web302- sql写shellweb303- insertweb304- 报错注入web305- 反序列化蚁剑连接数据库web306- 反序列化web307- shell_exce()web308- ssrf打mysqlweb309- ssrf打fastcgiweb310- ssrffastcfgi写shellweb301-SQL注入 check.php $username$_POST[userid]; $u…

php实现短链接系统

依据第二种算法,URL长连接转短连接实现方法如下: 语言:PHP5.6 服务器环境:LNMP 假设:长连接地址:http://www.test.com/index.php 短连接地址:http://t.test.com/六位code码 第一步&#xff…

Ubuntu18上安装搜狗输入法

一、说明 在ubuntu上安装中文输入法会经常遇到问题。本文是作者经过历次艰苦卓绝的努力后,安装成功的总结。这里稍作记录,以便日后安装时查询。 二、版本选择 注意:目前的搜狗和ubuntu版本是有个配套问题,如下表所列: …

【Typescript学习】使用 React 和 TypeScript 构建web应用(一)预览成品、初始化react项目、常见类型

教程来自freecodeCamp:【英字】使用 React 和 TypeScript 构建应用程序 跟做,仅记录用 其他资料:https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 第一天 1 学习目标(我个人的) 入门 …

开启前端CSS学习之路-css001

😊博主页面:鱿年年 👉博主推荐专栏:《WEB前端》👈 ​💓博主格言:追风赶月莫停留,平芜尽处是春山❤️ 目录 前言 一、CSS简介 1.HTML的局限性 2.CSS-网页美容师 3.CSS语法规范…

ccflow 代码

java 工作流的开发框架目录概述需求:设计思路实现思路分析1.工作流参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge S…

十大常见排序算法(java编写)

日升时奋斗,日落时自省 目录 1、插入排序 2、希尔排序 3、选择排序 4、堆排序 5、冒泡排序 6、快速排序 6.1、Hoare法找基准值 6.2、挖坑法找基准值 6.3、快慢指针找中间值 6.4、优化 6.5、非递归排序 7、归并排序 7.1、递归实现 7.2、非递归实现 7.…

车载通信协议-列车实时数据协议(TRDP)

TCNOPEN是一个铁路行业相关的合作伙伴创建的开源的倡议,其目的是建立一些新的或即将出台的铁路标准的关键部分,通常以TCN命名。TCN(列车通信网络)是IEC(国际电工委员会)第43工作组制定的一系列国际标准&…

C++学习/温习:新型源码学编程(一)

写在前面 本文约15页,如觉得文章过长请通过左侧边栏或知识点概览目录浏览食用面向初学者撰写专栏,个人原创的学习C/C笔记(干货)编程练习所作源代码输出内容为中文,便于理解如有错误之处请各位读者指正请读者评论回复、…

Go语言基础突破(一)——基础语法快速上手

文章目录一、本次学习重点内容:二、详细知识点介绍:1、什么是Go语言特点:2、为什么字节跳动全面使用go语言:3、开发环境——安装Golang:4、推荐编辑器:VScode、Goland5、基础语法1、HolleWorld2、基础语法——变量声明…

Ubuntu 玩机笔记

键盘Fn无法切换功能键与多媒体键 终端输入: echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode然后再长按 FnXL 约四秒即可成功使用Fn切换功能键与多媒体键。 永久生效 以上方法只是输入命令后生效,想要永久生效,可以进行如下操…

深度学习-吴恩达(C5)训练词向量

2.1 词汇表征 上周我们学习了RNN、GRU单元和LSTM单元。本周你会看到我们如何把这些知识用到NLP上,用于自然语言处理,深度学习已经给这一领域带来了革命性的变革。其中一个很关键的概念就是词嵌入(word embeddings),这…

手机提供GMS支持(适用安卓和鸿蒙系统)

手机提供GMS支持 - 适用安卓和鸿蒙系统前言方式1:安装GMS套件(不推荐)方式2:安装OurPlay(推荐)方式3:安装Gspace(推荐)前言 本文提供多种为手机(安卓和鸿蒙系…

数据库系统概论①——数据库系统基本概念

文章目录1、数据库的相关术语1.1 数据(Data)1.2 数据库(Database,简称DB)1.2.1 数据库的定义:数据库是长期储存在计算机内、有组织的、可共享的数据集合。1.2.2 数据库的特征1.3 数据库管理系统(DBMS)1.3.1 DBMS的主要功能1.4 数据库系统&…

自己动手写一个操作系统——MBR(4)_调试_elf_bin

文章目录前言elf 文件指定代码入口地址添加调试信息代码检验调试小结前言 通过 GDB 我们可以跟踪程序的执行, 并且能够看到寄存器的状态, 但是,上面这种调试方式,没有和代码对应起来,以致于我们无法直观地知道 CP…

CodeSYS之一EtherNET驱动禾川电机

硬件:HCFA Q0-1100系列CPU X3EB 驱动器, SV-X2MHO40A伺服电机,24V开关电源。 硬件连接: 电机三相线和编码器线接X3EB驱动器,24V电源接X3EB驱动器,驱动器IN网口接 CPUPort2,CPU接24V电源,Port1 接电脑。 这部分有问题可以直接进禾川官网 一、驱动器调试 接好先后,按驱动…