通俗易懂理解JAVA虚拟机(一)——类加载详解

抖音短视频数据抓取实战系列(一)——模拟器性能对比与优化配置 本文是抖音短视频数据抓取实战系列的开篇,重点探讨了模拟器选型与优化配置。通过对比雷电、夜神、逍遥三大主流模拟器在性能、抖音兼容性及抓包友好度上的表现,文章指出雷电模拟器因其稳定的桥接网络模式和良好的兼容性,是数据抓取的优选。并提供了雷电模拟器从安装、网络桥接到系统优化的详细配置指南,旨在帮助读者构建稳定高效的抓取环境。 阅读详情

通俗易懂理解JAVA虚拟机(一)

一:类加载机制的深入剖析*
1、类加载过程
多个java文件经过编译打包生成可运行jar包,最终由java命令运行某个主类的main函数启动程序,这里首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其它类,会逐步加载这些类。注意,jar包里的类不是一次性全部加载的,是使用到时才加载。
类加载到使用整个过程有如下几步:加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载
加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等
验证:校验字节码文件的正确性
准备:给类的静态变量分配内存,并赋予默认值
解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用,下节课会讲到动态链接
初始化:对类的静态变量初始化为指定的值,执行静态代码块
在这里插入图片描述
2、类加载器和双亲委派机制
上面的类加载过程主要是通过类加载器来实现的,Java里有如下几种类加载器
启动类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类
自定义加载器:负责加载用户自定义路径下的类包
看一个类加载器示例:
在这里插入图片描述
自定义一个类加载器示例:自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是loadClass(String, boolean),实现了双亲委派机制,大体逻辑

  1. 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。

  2. 如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加载器加载(即调用parent.loadClass(name, false);).或者是调用bootstrap类加载器来加载。

  3. 如果父加载器及bootstrap类加载器都没有找到指定的类,那么调用当前类加载器的findClass方法来完成类加载。

    还有一个方法是findClass,默认实现是抛出异常,所以我们自定义类加载器主要是重写findClass方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载器加载,扩展类加载器再委托启动类加载器,顶层启动类加载器在自己的类加载路径里找了半天没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里找了半天也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器,应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。
双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

为什么要设计双亲委派机制?
1.沙箱安全机制:
自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
2.避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

打破双亲委派
以Tomcat类加载为例,Tomcat 如果使用默认的双亲委派类加载机制行不行?
我们思考一下:Tomcat是个web容器, 那么它要解决什么问题:

  1. 一个web容器可能需要部署两个应用程序,不同的应用程序可能会依赖同一个第三方类库的不同版本,不能要求同一个类库在同一个服务器只有一份,因此要保证每个应用程序的类库都是独立的,保证相互隔离。
  2. 部署在同一个web容器中相同的类库相同的版本可以共享。否则,如果服务器有10个应用程序,那么要有10份相同的类库加载进虚拟机
  3. web容器也有自己依赖的类库,不能与应用程序的类库混淆。基于安全考虑,应该让容器的类库和程序的类库隔离开来。
  4. web容器要支持jsp的修改,我们知道,jsp 文件最终也是要编译成class文件才能在虚拟机中运行,但程序运行后修改jsp已经是司空见惯的事情, web容器需要支持 jsp 修改后不用重启。
    再看看我们的问题:Tomcat 如果使用默认的双亲委派类加载机制行不行?答案是不行的。为什么?
    第一个问题,如果使用默认的类加载器机制,那么是无法加载两个相同类库的不同版本的,默认的类加器是不管你是什么版本的,只在乎你的全限定类名,并且只有一份。第二个问题,默认的类加载器是能够实现的,因为他的职责就是保证唯一性。第三个问题和第一个问题一样。我们再看第四个问题,我们想我们要怎么实现jsp文件的热加载,jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的jsp是不会重新加载的。那么怎么办呢?我们可以直接卸载掉这jsp文件的类加载器,所以你应该想到了,每个jsp文件对应一个唯一的类加载器,当一个jsp文件修改了,就直接卸载这个jsp类加载器。重新创建类加载器,重新加载jsp文件。
    Tomcat自定义加载器详解

在这里插入图片描述
tomcat的几个主要类加载器:
commonLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;
catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;WebappClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;

从图中的委派关系中可以看出:CommonClassLoader能加载的类都可以被CatalinaClassLoader和SharedClassLoader使用,从而实现了公有类库的共用,而CatalinaClassLoader和SharedClassLoader自己能加载的类则与对方相互隔离。
WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。
而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的热加载功能。
tomcat 这种类加载机制违背了java 推荐的双亲委派模型了吗?答案是:违背了。
我们前面说过,双亲委派机制要求除了顶层的启动类加载器之外,其余的类加载器都应当由自己的父类加载器加载。很显然,tomcat 不是这样实现,tomcat 为了实现隔离性,没有遵守这个约定,每个webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器,打破了双亲委派机制。

量化交易之因子分析大全 在机器学习项目中,特征工程是非常重要的。在量化研究中也是如此。本文将量化研究中常用到的特征,也就是因子进行详细收纳,并给出推导公式和实现代码。 阅读详情

相关推荐

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 859

超级通俗易懂,深入浅出Java的类加载机制,原来是这么回事~

熟悉的读者都知道,,原来是这么回事,很多人表示,终于懂了,不信,咱们来看看JVM虚拟机中的一个重点知识-

庆哥Java的优快云技术博客 754

Canoe主要功能的详细介绍

CANoe是德国Vetor公司推出的一款用于总线开发的设备,全程为CAN open environment。后来随着总线技术的发展,CANoe不仅限于CAN类型的总线开发,还包含LIN、FlexRay、MOST和以太网等开发。在车载网络和ECU开发、测试和分析方面,CANoe几乎长期占据着垄断地位,当然是因为其强大的功能性了。目前用这个工具的主要是整车厂和供应商的网络设计工程是、开发工程师和测试工程师。小编当时安装CANoe的时候也是花了一定的时间和精力,好在没有崩溃。

车载测试 3723

通俗易懂的Java虚拟机类加载

Java虚拟机将定义类的信息从Class文件加载到内存,并对信息进行校验、解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是Java虚拟机的类加载过程。

StoNENee的博客 362

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 623

SAP FI 提示没有为会计年度0 定义版本2025 GP626

SAP 错误 GP626 是一个常见的系统消息,通常表示某个会计年度的版本(如版本 0)未被定义或未激活。:在执行某些事务(如创建采购订单、过账凭证或维护成本中心)时,系统会检查相关版本是否已定义。的“Settings for Each Fiscal Year”界面中,选择一个已激活的会计年度。的“Settings for Each Fiscal Year”界面中,找到未激活的会计年度。:在控制范围(Controlling Area)中,未为指定的会计年度定义版本 0。如果没有,添加或复制现有年度的设置。

GAVIN 2490

通俗易懂理解JAVA虚拟机

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、jvm是什么? 二、内存结构 1.程序计数器 2.虚拟机栈 3.本地方法栈 4.堆 5.方法区 总结 前言 java相比c++,他的优势是不用去考虑资源回收,因为内存管理,java虚拟机有垃圾回收,并且java虚拟机给我们提供了跨平台的特性,一次编译就可以到处去运行,因此我们需要去学习java虚拟机以便java内存出现溢出,内存泄漏时可以调优。java虚拟机有很多种,...

weixin_45984552的博客 1万+

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 944

类的加载过程(来一个通俗易懂的理解)

JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如图: 没错,以上就是抽象的类加载过程,写类加载过程的都是大同小异,图我也是copy来的,然后联想到近期刚刚入职新公司,下面我入职新公司来解释类加载(绝对通俗易懂): 加载(加载是指查找字节流并据此创建类的过程,说白了,就是把编译后的.Class静态文件转换到内存中(方法区),然后暴露出来让程序员能访问到) 场景:企业A发of...

weixin_30622107的博客 388

Python 爬虫实战:雪球用户数据爬取与投资行为分析(含 API 签名算法解析)

雪球作为国内领先的投资者社区,拥有丰富的用户数据和投资信息。通过爬取雪球用户数据并进行分析,我们可以深入了解用户的持仓偏好、交易行为和投资策略,为企业和投资者提供有价值的市场洞察。

yansideyucsdn的博客 2247

HBase骚操作之数据加载方式BulkLoad

本文研究了一种HBase BulkLoad的入库方式,该方式利用HBase的数据信息按照特定格式存储在hdfs内这一原理,直接在HDFS中生成持久化的HFile数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。该方式配合MapReduce完成,高效便捷,而且不占用Region资源,增添负载,在大数据量写入时能极大的提高写入效率,并降低对Hbase节点的写入压力。HBase BulkLoad对于异构数据源的合并及大量数据一次性导入具有重要指导意义,相比HBase Put操作在性能上具有较高的优势

石榴姐yyds 7789

【JVM】JVM类加载机制(类加载过程和类加载器)

JVM类加载机制什么是JVM?类加载机制类加载的时机类加载器类加载(Class Loading)过程1、 加载2、连接2.1验证2.2准备2.3解析3、初始化小结 什么是JVM? JVM(Java Virtual Machine)即Java虚拟机。Java程序跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。我们知道,java.e

玲珑骰子安红豆,入骨相思知不知 1041

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

深入理解Java虚拟机——类加载机制

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来

SmallWinWin的博客 1552

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解java虚拟机——类加载机制及双亲委派模型详解

深入理解java虚拟机——类加载机制 定义   类加载机制指的是:虚拟机将描述类的数据从class文件加载到内存中,对加载的数据进行验证,解析,初始化,最后得到虚拟机认可后转化为直接可以使用的java类型的过程   类加载机制一共有七个阶段:加载,验证,准备,解析,初始化,使用,卸载。其中的验证,准备,解析合称为连接阶段。   加载,验证,准备,初始化,卸载的顺序是确定是,另两个由动态绑定等情况可...

下雨了_简的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【深入理解Java虚拟机】类加载机制

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。本系列其他文章:【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM【深入理解Java虚拟机】垃圾回收机制1、类加载机制概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在java中,类型的加载、连

开心阳 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java虚拟机类加载机制详解

Java虚拟机的类加载机制是一个复杂且高效的过程,包括加载、验证、准备、解析和初始化等多个阶段。每个阶段都有严格的规范,确保程序在不同环境中稳定运行。理解类加载的时机、过程和类加载器的工作原理,有助于开发者更好地掌握JVM,优化应用程序的性能,解决类加载相关的问题。掌握双亲委派模型和类加载器的实现机制,对深入理解JVM和进行系统优化尤为重要。

dm菜鸟编程的专栏 994

【虚拟机】深入理解java虚拟机【类加载机制】

java虚拟机【类加载机制】

xjavaxx的博客 1559

深入理解java虚拟机类加载机制,通俗易懂

java源文件经编译后以.class的文件形式存在本地磁盘上,在Class文件中描述的各类信息最终都需要加载到虚拟机中之后才能被运行和使用 1.类加载机制在jvm中的位置 1.类加载过程 虚拟机把类的数据从.class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的Class对象的过程就叫做“虚拟机的类加载”,主要包括为3大阶段。 ...

Alphr的博客 624

深入理解Java虚拟机的类加载机制

Java虚拟机的类加载机制是Java平台灵活性和可扩展性的关键所在。通过深入理解类加载的概念、过程、类加载器、双亲委派模型以及类的卸载与重加载,开发者可以更好地掌握Java程序的运行原理,并在必要时通过自定义类加载器和热部署等技术手段,实现高度灵活的应用架构。在Java虚拟机中,类的加载是指将class文件从硬盘读取到内存中,并创建对应的Class对象的过程。1. 使用自定义类加载器动态加载类。2. 自定义类加载器的实现与优化。3. 类的卸载与重加载策略。1. 系统提供的类加载器。四、类的卸载与重加载。

N201871643的博客 763

[深度理解java虚拟机]第7章 虚拟机类加载机制

文章目录7.1 概述7.2 类加载的时机7.3 类加载的过程7.3.1 加载7.3.2 验证7.3.3 准备7.3.4 解析7.3.5 初始化7.4 类加载器7.4.1 类与类加载器7.4.2 双亲委派模型 7.1 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。 7.2 类加载的时...

qq_43115606的博客 2809

Java类加载机制详解

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制

怪咖@的博客 2503

Java JVM的类加载过程详解

本文深入介绍Java的类加载过程:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)。

终生学习践行者 3490

深入理解java虚拟机中类加载机制

1.1 概述 虚拟机把描述一个类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成被java虚拟机使用的Java类型。这就是虚拟机的类加载机制。 Calss文件由类加载器加载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息间接调用Calss对象的功能。 编译器会把.java文件编译成.class文件,也就是字节码文件。 1.2 类加载的生命周期 类加载的整个

Deronn的博客 1233

《深入理解 Java 虚拟机:类加载机制》

重要性程序运行基础:类加载是Java程序运行的第一步,它负责将类的字节码加载到内存中,并进行验证、准备和初始化等操作,为程序的执行做好准备。动态性支持:Java语言的动态性很大程度上依赖于类加载机制,通过类加载机制,Java程序可以在运行时动态地加载类、解析类和初始化类,从而实现程序的动态扩展和灵活性。相关概念类与类加载器:每个类都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,类加载器负责将类的字节码加载到内存中,而类则是程序的基本执行单元。类加载过程阶段。

weixin_51105979的博客 878

《深入理解java虚拟机》学习笔记6——类加载机制

Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段,java虚拟机需要完成以下3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流。 b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的运行时数据结构。 c.在java堆中生成一个代表该类的java.l

Tony Chen的专栏 8720
下一篇: 通俗易懂理解JAVA虚拟机(二)——JVM整体结构深度解析
快乐小柴
博客等级 码龄7年 4粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值