当前位置: 首页 > news >正文

JVM类加载机制

回到2018年的抖音哈哈.

回顾下:

  1. java开发环境:

    java编译运行过程:
    • 1) 编译期:.java源文件,经过编译,生成.class字节码文件

      2) 运行期:JVM加载.class并运行.class(0和1)

      特点: 跨平台、一次编程,处处报错

    • 名词解释:

      1) JVM: java虚拟机

      加载.class并运行.class

      2) JRE: java运行环境

      除了包含JVM以外,还包含了运行java程序所必须的环境

      JRE = JVM+java系统类库(小零件)

      3) JDK: java开发工具包

      除了包含JRE以外,还包含了开发java程序所必须的命令工具

      JDK=JRE+编译、运行等命令工具

      结论:

      1) 运行java程序的最小环境为JRE

      2) 开发java程序的最小环境为JDK

Java中类加载器:

1.引导类加载器(启动类加载器):负责加载支撑JVM运行的位于JAR的lib类库.(该对象实际上是C++生成的对象)

BootstrapClassLoader

由引导类加载器负责加载创建其他类的加载器

2.扩展类加载器:负责加载支撑JVM运行的JRE的lib目录下的ext扩展目录下的jar包ExtensionClassLoader

3.应用程序类加载器:负责加载ClassPath路径下的类.主要就是自己写的类

ApplicationClassLoader

4.自定义加载器:负责加载用户自定义路径下的类

流程:

1.windows系统下,java.exe调用底层的jvm.dll文件创建java虚拟机(C++实现)

2.java虚拟机创建一个引导类加载器(C++实现)

3.引导类加载器加载sun.mis.Launcher创建其他类加载器

4.(其实加载的时候就初始化好了)通过Launcher.getLauncher()创建ExtClassLoader(扩展类加载器)和AppClassLoader(应用类加载器)

JVM启动器实例sun.mis.Launcher初始化使用单例模式,保证JVM虚拟机只有一个sun.mis.Launcher实例,在Launcher构造方法内部,创建了两个类加载器

分别是:

1.sun.misc.Launcher.ExtClassLoader(扩展类加载器)

2.sun.misc.Launcher.AppClassLoader(应用类加载器)

JVM默认使用Launcher.getClassLoader()方法返回AppClassLoader实例加载我们的应用程序

而 this.loader如下  是将ExtClassLoader做为参数给了AppClassLoader,因此也可以说ExtClassLoader是AppClassLoader生父

 大概就是这么个意思

关于双亲委派机制

 

 双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

双亲委派机制的目的:

1.沙箱安全机制:防止核心 API库被随意篡改
2.避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一
次,保证被加载类的唯一性

全盘负责委托机制
全盘负责:是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类
所依赖及引用的类也由这个ClassLoder载入。
关于自定类加载器:百度.自定义加载器的父加载器是AppClassLoader.是父加载器....不是父类

自定义类加载器只需要继承java.lang.ClassLoader类.

ClassLoader类有两个核心方法,一个是loadClass(String str,boolean b)

上面这个方法,实现了双亲委派机制

还有一个方法是findClass 

默认是空实现

自定义类加载器主要是重写findClass方法

如果想打破双亲委派机制,那么自定义加载器重写ClassLoader里loadClass(String str,boolean b)方法,百度一堆

Tomcat打破双亲委派机制的原因在于它可能部署不同的应用,那么不同应用可能依赖于同一个第三方,但是不同版本的依赖,这样的话,不能要求这些第三方依赖只有一份,因要要保证这些依赖的独立存在,就需要打破双亲委派机制.另外就是相同依赖的类库只需要一份,不然负担太重
其实有点相互矛盾,指定需要打破双亲委派的路径即可

相关文章:

JVM类加载机制

回到2018年的抖音哈哈. 回顾下: java开发环境: java编译运行过程: 1) 编译期:.java源文件,经过编译,生成.class字节码文件 2) 运行期:JVM加载.class并运行.class(0和1) 特点: 跨平台、一次编程,处处报错 名词解释: 1…...

8.1 优化概述

数据库性能取决于数据库级别的几个因素,例如表、查询和配置设置。这些软件结构导致了硬件级别的 CPU 和 I/O 操作,您必须将其最小化并尽可能提高效率。在研究数据库性能时,首先要学习软件端的高级规则和准则,然后使用墙上的时钟时…...

从0到1一步一步玩转openEuler--14 openEuler DNF(YUM)配置管理

文章目录14.1 DNF配置文件14.1.1 配置main部分14.1.2 配置repository部分14.1.3 显示当前配置14.2 创建本地软件源仓库14.3 添加、启用和禁用软件源14.3.1 添加软件源14.3.2 禁用软件源14.3.3 启用软件源DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查…...

leetcode707 设计链表 带有输入和输出的

题目: 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节…...

100种思维模型之非sr思维模型-012

什么是sr? sr是stimulus-response的缩写,意思是刺激反应。 那么非sr思维模型就是非刺激反应思维模型的意思。 今天我们来聊聊非sr思维模型——一个提醒我们思考,提醒我们任何时刻都有选择权的思维模型。 本文依然从三个方面进行介绍,何谓…...

绿竹生物再冲刺港交所上市:暂未商业化,孔健夫妇为实控人

近日,北京绿竹生物技术股份有限公司(下称“绿竹生物”)在港交所递交招股书,准备在港交所主板上市,中金公司为其独家保荐人。据贝多财经了解,绿竹生物曾于2022年6月28日在港交所递表。 相较于此前招股书&am…...

加拿大MSB金融牌照申请方案

什么是加拿大MSB金融牌照? 根据犯罪所得(洗钱)和恐怖主义融资法案,您的企业必须在加拿大金融交易和报告分析中心 (FINTRAC) 注册成为货币服务企业。自 2020 年 6 月 1 日起,外国货币服务企业也必须在 FINTRAC 注册&…...

javaEE 初阶 — 滑动窗口

文章目录滑动窗口1 滑动窗口下如何处理丢包TCP 工作机制:确认应答机制 超时重传机制 连接管理机制 滑动窗口 确认应答机制、超时重传机制、连接管理机制 都是给 TCP 的可靠性提供支持的。 虽然事变的比较可靠了,但是是有牺牲的,那就是传输…...

大咖说·图书分享|狼书(卷3):Node.js高级技术

Node.js都有哪些需要掌握的高级技术?前端为什么同样需要学习? Node.js未来的发展趋势究竟如何?本期大咖说,Node布道师桑世龙携新作《狼书(卷3):Node.js高级技术》展开分享。 ● 嘉宾介绍 桑世龙:Node布道…...

1.5配置NBMA和P2MP网络类型

1.3.3实验5:配置NBMA和P2MP网络类型 1. 实验需求 控制OSPF DR的选举修改OSPF的网络类型2. 实验拓扑 配置NBMA和P2MP网络类型实验拓扑如图1-13所示。 图1-13 配置NBMA和P2MP网络类型 3. 实验步骤 帧中继的配置如图1-14和图1-15所示...

Java面试题

三次握手,四次挥手中,为什么要挥手四次 第一次握手,客户端发送同步报文到服务端,客户端知道自己有发送数据能力,不知道服务端是否有发送、接受数据能力。 第二次握手,服务端收到同步报文,并回复…...

opencv锁定鼠标定位

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...

机器连接和边缘计算

以一种高效、可扩展的方式进行连接和边缘计算的结合,解决了在工业物联网应用中的机器数据集成问题。 一 边缘计算 边缘计算描述了由中央平台管理的数据分散式处理。边缘计算对于工业物联网而言非常重要。在许多应用程序中,由于数据量非常大,…...

利用NGROK将本地网站发布为一个公开网站

一般与第三方服务集成时,需要提供https的回调URL,本地开发阶段可以利用NGROK将本地网站发布为公开的https网站。https://ngrok.com/downloadWindow下载地址:https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-windows-amd64.zip以Window…...

Vulnhub 渗透练习(一)—— Breach 1.0

环境搭建 环境下载: https://www.vulnhub.com/entry/breach-1,152/ 环境描述: Vulnhub 中对此环境的描述: VM 配置有静态 IP 地址 (192.168.110.140),因此您需要将仅主机适配器配置到该子网。 这里我用的是 VMware &#xff0…...

初探Spring采用Spring配置文件管理Bean

文章目录Spring容器演示--采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇敢骑士…...

【手写 Vuex 源码】第十二篇 - Vuex 插件机制的实现

一,前言 上一篇,主要介绍了 Vuex 插件的开发,主要涉及以下几个点: Vuex 插件的使用介绍;Vuex 插件开发和使用分析;Vuex 插件机制的分析; 本篇,继续介绍 Vuex 插件机制的实现&…...

图像去噪技术简述

随着每天拍摄的数字图像数量激增,对更准确、更美观的图像的需求也在增加。然而,现代相机拍摄的图像不可避免地会受到噪声的影响,从而导致视觉图像质量下降。因此,需要在不丢失图像特征(边缘、角和其他尖锐结构&#xf…...

数据迁移——技术选型

日常我们在开发中,随着业务需求的变更,重构系统是很常见的事情。重构系统常见的一个场景是变更底层数据模型与存储结构。这种情况下就要对数据进行迁移,从而使业务能正常支行。 背景如下:老系统中使用了mongo数据库,由…...

第二十七章 java并发常见知识内容(CompletableFuture)

JAVA重要知识点CompletableFuture常见函数式编程操作创建 CompletableFuture静态工厂方法处理异步结算的结果异常处理组合 CompletableFuturethenCompose() 和 thenCombine() 区别并行运行多个 CompletableFutureCompletableFuture Java 8 才被引入的一个非常有用的用于异步编…...

Qwen3.5-9B-AWQ-4bit部署教程:基于CSDN GPU平台的7860端口快速访问指南

Qwen3.5-9B-AWQ-4bit部署教程:基于CSDN GPU平台的7860端口快速访问指南 1. 模型介绍 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合处理以下任务: …...

ollama一键部署QwQ-32B:64层高推理能力模型的低成本GPU算力实践

ollama一键部署QwQ-32B:64层高推理能力模型的低成本GPU算力实践 想体验媲美DeepSeek-R1的推理能力,又担心大模型对硬件要求太高?今天给大家分享一个好消息:QwQ-32B这个拥有64层深度架构的推理模型,现在可以通过ollama…...

PyTorch炼丹避坑指南:list、numpy、tensor互转时,90%新手会踩的数据类型坑

PyTorch数据类型转换避坑实战:从原理到解决方案的深度解析 在深度学习项目开发中,数据类型的正确转换往往被初学者忽视,却可能成为调试过程中最耗时的"隐形杀手"。想象一下这样的场景:你花费数小时构建的模型在训练时突…...

从滤波到优化:手把手拆解VIO算法核心,看懂OpenVINS的MSCKF和ORB-SLAM3的BA到底差在哪

从滤波到优化:手把手拆解VIO算法核心,看懂OpenVINS的MSCKF和ORB-SLAM3的BA到底差在哪 视觉惯性里程计(VIO)技术近年来在机器人导航、增强现实等领域展现出强大的生命力。对于开发者而言,理解不同技术流派的核心差异&am…...

告别玄学调试:用逻辑分析仪和Python脚本深度验证AD7124的SPI与寄存器

从波形分析到自动化验证:AD7124寄存器调试的工程化实践 调试精密ADC芯片从来不是简单的"通电-读取"过程。当我在一个高精度温度测量项目中首次接触AD7124时,那些看似随机的寄存器写入失败、飘忽不定的转换结果和难以复现的异常状态&#xff0…...

WebPlotDigitizer:科研图表数据提取的终极指南,效率提升700%

WebPlotDigitizer:科研图表数据提取的终极指南,效率提升700% 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 你…...

18.MCP工程化接入实践:配置抽离、异常兜底与项目文档收口

目 录今天干了什么核心变化1.抽离MCP配置2.异常处理3.文档维护今天干了什么 今天主要工作是对昨天接入系统的MCP服务做了工程化收口工作,抽离了项目配置、增加异常处理并完善了项目文档。目的当然是为了方便未来项目的迁移并增加项目的鲁棒性和完整性。 核心变化 …...

KICS:把每把锁变成一行代码——每一个文明角色疑虑拆弹方案

KICS:把每把锁变成一行代码——每一个文明角色疑虑拆弹方案摘要: 政客怕主权沦丧、标准被武器化,KICS 以地理分布式节点、主权规则适配层、非对称共识及紧急熔断机制回应;资本怕没有护城河与需求缺失,KICS 锁定 AI 保险…...

手把手教你理解交叉编译:从嵌入式开发到Rust编译Android So库

手把手教你理解交叉编译:从嵌入式开发到Rust编译Android So库 当你在x86架构的笔记本上按下编译按钮,却要为树莓派(ARM架构)生成可执行文件时,背后发生了什么?这种"在A平台编译B平台程序"的技术&…...

告别Matlab仿真:手把手教你用C语言在STM32上实现巴特沃斯低通滤波器

STM32实战:从零构建巴特沃斯低通滤波器的嵌入式实现 在嵌入式系统开发中,数字信号处理一直是工程师面临的挑战之一。传统Matlab仿真虽然能快速验证算法,但将理论转化为实际可运行的嵌入式代码却存在巨大鸿沟。本文将彻底打破这一壁垒&#xf…...