JVM类加载机制简单介绍

深入解析SGLang框架:从架构设计到核心组件实现 本文深入解析了SGLang框架的架构设计与核心组件实现。SGLang是一个专为大语言模型推理设计的高效框架,其核心优势在于清晰的分层架构、高效的调度策略以及精细的内存管理。文章详细剖析了其客户端接入、服务器端调度、模型执行引擎及Tokenizer/Detokenizer管理器等关键组件,揭示了其实现高性能推理的内部机制。 阅读详情

本文为《深入理解Java虚拟机JVM高级特效与最佳实践(第三版)》一书的摘要总结

类加载时机

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

在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略为Java应用提供了极高的扩展性和灵活性,Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实现的。

类的生命周期:

其中加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,解析阶段可能在初始化之前也可能在初始化之后进行。

在遇到以下情况,必须对类进行“初始化”(而加载,验证、准备自然需要在此之前进行):

  • 遇到new,getstatic,putstatic或invokestatic这4条字节指令时,如果类型没有进行过初始化,则需要先触发器初始化阶段。能够生成这4条指令的典型Java代码场景有:

    • 使用new关键字实例化对象的时候
    • 读取或者设置一个类型的静态字段
    • 调用一个类型的静态方法的时候
  • 使用java.lang.reflect包的方法对类型进行反射调用的时候

  • 当初始化类的时候,如果发现其父类还没有进行初始化,则需要先触发器父类的初始化

  • 当虚拟机启动的时候,用户需要指定一个要执行的主类(包含main()方法的类),虚拟机会先初始化这个类

  • 当使用JDK7加入的动态语言支持是,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic,REF_putStatic,REF_invokeStatic,REF_newInvokeSpecial四种类型的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发器初始化阶段。

  • 当一个接口中定义了JDK8新加入的默认方法是,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化

类的加载过程

加载

在加载阶段,虚拟机主要完成三件事情:

  • 通过一个类的全限定名称来获取定义此类的二进制字节流。
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(这个结构完全由虚拟机实现决定,且只是转换,还没有装入方法区)
  • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

验证

这一阶段是连接的第一阶段,该阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,确保这些信息被当做代码运行后不会危害虚拟机自身的安全。

验证阶段大致会完成下面4个阶段:

  • 文件格式验证

是否以魔数0xCAFEBABE开头;主次版本号是否在当前Java虚拟机接受的范围内;常量池的常量中是否有不被支持的常量类型(检查常量的tag标志)等等;这个阶段主要是保证输入的字节流能够被正确的解析并存入方法区之内,格式上符合描述一个Java类型信息的要求。这个阶段的验证基于二进制流,只有通过了这个验证阶段之后,这段字节流才被允许存入Java虚拟机内存的方法区,所以后面的三个验证阶段全部在方法区的存储结构上进行。

  • 元数据验证

对字节码描述的信息进行语义分析,以保证其描述的信息符合《Java虚拟机规范》的要求,主要验证的点有:

  1. 这个类是否父类(除java.lang.Object外,所有的类都应该有父类)
  2. 这个类的父类是否继承了不允许被继承的类(final修饰的类)
  3. 如果这个类不是抽象类,是否实现了父类或者接口之中要求实现的所有方法
  4. 类中的方法、字段是否与父类产生了矛盾(如覆盖了final字段,不符合规则的方法重载等)
  • 字节码验证

这个阶段是整个验证过程中最复杂的一个阶段,主要目的是通过数据流分析和控制流分析,确定程序语义是否是合法的、符合逻辑的。就是对类的方法体(Class文件中的Code属性)进行校验分析,保证被校验的类的方法在运行时不会做出危险虚拟机安全的行为,如:

  1. 保证任何时刻操作数栈的数据类型与指令代码序列都能配合工作
  2. 保证任何跳转指令都不会跳转到方法体以为的字节码指令上
  3. 保证方法体中的类型转换总是有效的
  • 符号引用检验

这个阶段的检验发生在虚拟机将符号引用转化为直接引用的时候,这个转化的工作将在连接的第三个阶段————解析阶段 中发生。

本阶段通常需要校验一下内容:

  1. 符号引用中,通过字符串描述的全限定名能否找到对应的类。
  2. 在指定类中是否存在符合方法的字段描述符及简单名称所描述的方法和字段。
  3. 符号引用中的类、字段、方法的可访问性是否可被当前类访问。

符号引用验证的主要目的是为了确保解析行为能够正常执行。

验证阶段对于迅疾的类加载机制来说,是一个非常重要的、但却不是必须要执行的阶段。如果程序运行的全被代码都已经反复使用和验证过,在生产环境中的实施阶段就可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,一缩短虚拟机类加载的时间。

准备

准备阶段是正式为类中定义的 变量 (静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。

从概念上讲,这些变量都应该被在方区中进行分配,但必须注意这个方法区本身是一个 逻辑上 的区域,在JDK7及之前,HotSpot使用永久代来实现方法区时,实现是完全符合这种逻辑概念的;在JDK8及以后,类变量则会随着Class对象一起存在Java堆中。

解析

解析阶段是Java虚拟机将 常量池内的 符号引用替换为直接引用的过程。(就是解析符号引用)

  • 符号引用:符号引用以一组 符号 来描述所引用的目标,符号可以是任何形式的 字面量,只要使用时能无歧义的定位到目标即可。
  • 直接引用:直接引用是指可以直接指向目标的 指针、相对偏移量 或者是一个能间接定位到目标的 句柄。

类或接口解析

在类D中,将一个从未解析过的符号引用N解析为一个类或者接口C的直接引用,虚拟机的整个解析过程为:

  1. 如果C不是一个数组类型,虚拟机将代表N的全限定名称传递给D的类加载器去加载这个类C。

  2. 如果C是一个数组类型,并且数据的元素为对象,那将会按照第一点的规则加载数组 元素类型。

  3. 如果上面两步没有问题,那么C在虚拟机中已经成为一个有效的类或者接口了。

字段解析

  1. 先将字段表内class_index项中索引的CONSTANT_Class_info符号引用进行解析,解析完成后把这个字段所属的类或者接口用C表示;
  2. 如果C本身就包含了简单名称和字段描述符都与与目标匹配的字段,则返回这个字段的直接引用,查找结束。
  3. 否则,如果C中实现了接口,将会按照继承关系从下往上地柜搜索各个接口和它的父接口,如果接口中包含了简单名称和字段描述符都与与目标匹配的字段,则返回这个字段的直接直接引用。
  4. 否则,如果C不是java.lang.Object的话,将会按照继承关系从下往上地柜搜索其父类,如果在父类中包含了简单名称和字段描述符都与与目标匹配的字段,则返回这个字段的直接直接引用。
  5. 否则查找失败。

方法解析

  1. 先将方法表内class_index项中索引的CONSTANT_Class_info符号引用进行解析,解析完成后把这个方法所属的类或者接口用C表示;
  2. 在类C中查找是否有简单名称和方法描述符都与与目标匹配的方法,则返回这个方法的直接引用,查找结束。
  3. 否则,在类C的父类中地柜查找是否有简单名称和方法描述符都与与目标匹配的方法,有则返回这个方法的直接引用。
  4. 否则,在类C实现的接口列表及他们的父接口中递归查找是否有简单名称和方法描述符都与与目标匹配的方法,有则返回这个方法的直接引用。
  5. 否则查找失败。

接口方法解析

  1. 先解析出接口方法表中class_index项中索引的CONSTANT_Class_info符号引用进行解析,解析完成后把这个方法所属的类或者接口用C表示;
  2. 如果发现C是一个类,而不是接口,那么直接爆出异常。
  3. 否则,在接口C中查找是否有简单名称和方法描述符都与与目标匹配的方法,有则返回这个方法的直接引用。
  4. 否则在C的父接口中递归查找,知道java.lang.Obect类为止,看是否有简单名称和方法描述符都与与目标匹配的方法,有则返回这个方法的直接引用。
  5. 在上一步中,可能会找到多个简单名称和方法描述符都与与目标匹配的方法,那将会从多个方法中返回其中一个并结束查找。
  6. 否则查找结束。

初始化

类的初始化时类加载的最后一个步骤,直到这一步,虚拟机才开始执行类中编写的Java程序代码,将主导权移交给应用程序。初始化阶段是执行类构造器<init>()方法的过程。<init>()方法并不是程序员在Java代码中直接编写的方法,而是Javac编译器的自动生成物。

  • <init>()方法是有编译器自动收集类中所有 类变量的赋值动作 和 静态语句块 中的语句合并产生的。顺序由源文件中出现的顺序决定。静态语句块知道能访问到定义在它之前的变量,定义在它之后的变量只能赋值,无法访问。

  • <init>()方法与类的构造函数不同,,它不需要显示的调用父类构造器,Java虚拟机会保证在子类的<init>()方法执行前,父类的<init>()方法已经执行完毕。因此在Java虚拟机中,第一个被执行的<init>()方法一定是java.lang.Object类的。

  • <init>()方法对于类或者接口来说不是必须的,当类既没有赋值操作也没有静态语句块时,或接口没有赋值操作时,编译器就不用为该类或接口生成<init>()方法。

  • 接口中可以有变量初始化的操作,所以也会生成<init>()方法,但是接口与类不同的是,执行接口的<init>()方法不会调用父接口的<init>()方法,因为只有当父接口定义的变量被使用时,父接口才会被初始化。此外,接口的实现类在初始化时也不会执行接口的<init>()方法。

  • Java虚拟机必须保证一个类的<init>()方法在多线程环境下被正确的加锁同步。

类加载器

实现通过一个类的全限定名来获取描述该类的二进制字节流这个动作的代码被称为类加载器。

双亲委派模型

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

  • 启动类加载器(Bootstrap ClassLoader):这个类加载器是由C++语言实现的,是虚拟机的一部分
  • 其他所有类加载器:这些类加载器有Java语言实现,独立于虚拟机,并且全部继承自抽象类java.lang.ClassLoader

三层类加载器、类加载器双亲委派模型:

  • 启动类加载器:这个类负责将<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数指定的路径中存放的Java虚拟机能够识别的类库加载到虚拟机的内存中。

  • 扩展类加载器:负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所制定的路径中的类库。

  • 应用累加载器:应用类加载器是ClassLoader类中的getSystemClassLoader()方法的返回值,所以有些场合也被称为“系统类加载器”。它负责加载用户类路径(ClassPath)上的所有类库。如果应用中没有自定义类加载器,一般情况下这个就是程序中默认的类加载器。

上面图中所展示的各种类加载器的层次关系被称为类的“双亲委派模型”,类加载器之间的关系一般不死以继承的关系来实现的,而是以组合的关系来复用父加载器的代码。

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都会委派给了启动类加载器。只有当父加载器无法完成加载请求是,子加载器才会尝试自己去完成加载。

『言善信』Fiddler工具 — 1、Fiddler介绍与安装 文章目录1、Fiddler简介2、Fiddler功能3、Fiddler工作原理4、Fiddler安装 1、Fiddler简介 Fiddler是强大的抓包工具之一,它能记录所有客户端和服务器之间的HTTP和HTTPS请求,是web调试的利器。 Fiddler是位于客户端和服务端之间的HTTP代理,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。 Fiddler可以抓取支持HTTP代理的任意程序的数据包,如果要抓取https会 阅读详情

相关推荐

手把手教你用ZEMAX复现贝塞尔光束:从Thorlabs锥透镜到Edmund透镜的完整光路搭建

本文详细介绍了如何在ZEMAX光学设计软件中复现贝塞尔光束,从Thorlabs锥透镜到Edmund透镜的完整光路搭建过程。通过逐步指导,帮助研究人员和工程师掌握光学设计技巧,实现无衍射特性的贝塞尔光束生成,适用于激光加工和生物成像等领域。

weixin_33737774的博客 182

Java-10.14

内存分配与回收策略 Minor GC 和 Full GC Minor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。 Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。 内存分配策略 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 上分配,当 Eden 空间不够时,发起 Minor GC。 大对象直接进入老年代 大对象是指需要连续内存空

Desperate_gh的博客 709

AI辅助专利撰写实战:30分钟高效产出发明专利初稿

在技术创新的浪潮中,专利撰写常常是开发者将创意转化为知识产权保护壁垒的关键一步,但这个过程往往耗时费力,需要兼顾技术深度与法律文书规范。近期,借助AI辅助工具来提升专利撰写效率已成为一个热门探索方向。本文将围绕如何利用AI工具,在30分钟内高效完成一篇具备授权潜力的发明专利初稿,进行一场从0到1的实战演练。无论你是独立开发者、初创团队的技术负责人,还是希望保护自己研究成果的学生,这套方法都能帮助你快速梳理技术方案,形成结构严谨、逻辑清晰的专利申请文档。 1. 背景与核心概念:AI辅助专利撰写的价值与边界 在

weixin_34253126的博客 495

JVM类的加载机制

1 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 1.1 类的加载过程 1.2 加载 加载,是整个类加载过程的第一步,如果需要创建类或者接口,就需要现在Java虚拟机方法区创建于虚拟机实现规定相匹配的内部表示。

qq_34125999的博客 1万+

搭建Dzzoffice 教程

通过以上步骤,您已经成功配置了WEB环境,安装了DzzOffice,并完成了系统设置和应用安装。1.安装包的设置默认是系统盘之外的第二个盘,没有其他盘符的时候则安装在C盘,当主机盘符只有C盘可用的时候,安装时不要使用U盘,否则可能误装到U盘当中。4.如果之前已经安装,再次安装时请确保上次安装已经卸载或者所有文件可读,否则请备份文件,卸载之后再安装。在其他安装环境中,我没有相关的使用经验。3. 保证安装路径是纯净的,安装路径下不能有已安装的V8版本,若重新安装,请选择其它路径。

小胡的博客 4953

ros2 humble中使用realsense t265与d435

前提,安装realsense SDK 2.51.1版本并且能成功启动realsense-viewer V2.51.1想要在ros2中使用realsense t265,必须配合realsense SDK v2.51.1使用realsense-ros 4.51.1版本,因为新版本realsense ros2不再对t265支持下面记录源码编译安装 realsense-ros 4.51.1版本。

m0_72797388的博客 955

JVM的类加载机制《简要概述》

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

心有谦谦结 801

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-知识图谱制作、使用、dify集成

本文探讨了在构建本地RAG(Retrieval-Augmented Generation)系统时,如何通过引入知识图谱来增强系统的知识理解能力。传统的向量数据库和嵌入模型虽然能处理语义匹配,但无法有效捕捉知识间的关联性。知识图谱通过“实体-关系-属性”的结构化表示,能够更好地支持推理、推荐和多跳问答等高级功能。文章详细介绍了知识图谱的基本概念、制作思路,以及如何使用Neo4j图数据库进行知识图谱的构建和查询。通过实例展示了从PDF文件解析到知识图谱入库的全过程,强调了知识图谱在提升RAG系统性能中的重要作用

少说,多做 565

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1、什么是类加载?类加载的时机? 2、什么是类初始化?什么时候进行类初始化? 3、什么时候会为变量分配内存? 4、什么时候会为变量赋默认初值?什么时候会为变量赋人为设定的初值? 5、类加载器是什么? 6、如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*

Leeon的博客 6万+

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

大华 DSs 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限poc验证是否存在漏洞如果你想查询用户名和密码。

holyxp的博客 4004

dolphinscheduler-3.4.0

dolphinscheduler集群部署

docsz的博客 660

深入JVM类加载机制

类加载的流程以及双亲委派模型

Floating Cat 2万+

stata 工具变量法【计量经济系列(七)】

stata 工具变量法【计量经济系列(七)】 1. 内生性 2. 工具变量3. 2SLS (二阶段最小二乘法) 4. 弱工具变量5. 工具变量外生性的过度识别检验 6. 豪斯曼检验6.1 传统豪斯曼 6.2 杜宾-吴-豪斯曼检验(DWH)

侯小啾技术博客 2万+

JVM 类加载机制(一)

JVM类加载机制概览

ch15851302205的专栏 214

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JVM类加载机制

点击上方“方志朋”,选择“置顶或者星标”你的关注意义重大!如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。加载加载是类加载过程中...

方志朋的博客 86

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

简单的JVM类加载机制

忙里偷闲,赶紧记录下来类加载机制,方便以后回顾 JVM类加载机制 JVM把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 特点:类型的加载、连接和初始化过程都是在程序运行期间完成的。 类加载生命周期 上述的几个过程中:加载、验证、准备、初始化的顺序是确定的,而其中的解析则也有可能在初始化后进行

摩尔的博客 864

简单理解:JVM-类加载机制

简单理解:JVM-类加载机制 为了加深印象,防止自己一次又一次上网查阅,所以根据网上所查手动粘贴整理一下,以便个人记忆,希望大家多多指正 一、什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行校验、准备、解析、初始化,最终形成被JVM可以直接使用的java类型的全过程 1.加载: 将class文件加载在内存中。 将静态数据结构(数据存在于class文件的结构)转化成方法区中运行时的数据结构(数据存在于JVM时的数据结构)。 在堆中生成一个代表这个类的java.lang.Class对象

qq_41200879的博客 192

【JVM】JVM类加载机制和双亲委派模式

【JVM】JVM类加载过程和类加载器1、类的生命周期2、类加载过程2.1 加载2.1.1 加载机制-双亲委派模式2.2 验证2.3 准备2.4 解析2.5 初始化3 卸载 1、类的生命周期 2、类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用 系统加载 Class 类型的文件主要三步:加载->连接->初始化。 连接过程又可分为三步:验证->准备->解析。...

aaa_bbb_ccc_123_456的博客 1万+

【JVM】——JVM运行机制、类加载机制、内存划分

JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型

阿华的博客 1301

JVM——JVM工作机制、类加载机制、堆、栈、垃圾回收机制、JVM参数

介绍JRE、JDK、JVM的关系,简述JVM的工作机制,了解类加载机制(双亲委派机制)、垃圾回收机制和垃圾回收器、设置JVM参数

YR_112233的博客 1496

JVM类加载机制深度解析

在深入探讨Java虚拟机(JVM)的运行机制时,我们不可避免地会接触到类加载机制。想象一下,一个复杂的Java应用程序,它由数十个甚至数百个类组成,这些类是如何在运行时被JVM识别、加载并执行的?这就是类加载机制所要解决的问题。在Java应用程序中,类加载是JVM执行的第一步,也是至关重要的一个环节。它确保了在运行时,只有被JVM认可的类才能被加载到内存中,从而执行相应的代码。然而,在实际应用中,由于类加载的不当使用,可能会引发诸如类冲突、内存泄漏等问题。

我是Java程序员廖志伟,感谢朋友们的支持! 981

JVM-类加载机制

对于Java开发者来说,我们每天都在编写.java文件,然后通过编译器将其编译成.class文件。那么,这些.class文件是如何被加载到Java虚拟机(JVM)中,并最终变成我们可以在程序中使用的对象和方法的呢?这个过程就是类加载(Class Loading)。理解类加载机制,不仅仅是满足技术好奇心,更是解决实际问题的关键。你是否遇到过或异常?是否好奇为什么 Tomcat 等Web容器可以隔离不同应用的类库?是否想了解热部署、模块化等高级特性是如何实现的?这些问题的答案,都深藏在类加载机制之中。类加载。

左灯右行的爱情 1695

JVM面试 类加载机制

JVM的类加载机制 一、JVM的运行机制 JVM 是用于运行Java字节码的虚拟机,包括一套字节码指令集,一组程序寄存器,一个虚拟机栈,一个虚拟机堆,一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互; Java程序具体运行过程: JAVA源文件被编译器编译成字节码文件 JVM将字节码文件编译成相应操作系统的机器码 机器码调用相应操作系统的本地方法库执行相应的方法 二、JVM的类加载机制 1.JVM的类加载阶段 加载 验证 准备 解析 初始化 在类初始化完成后就可以使用该

分享技术,享受生活 7390

JVM 类加载机制详解

在 Java 虚拟机(JVM)中,类加载机制是一个非常重要的组成部分,它负责将类的字节码文件加载到内存中,并进行一系列的处理,最终使类能够被虚拟机使用。本文将详细介绍 JVM 类加载机制的相关内容。

面团到油条的成长日记 1286

JVM类加载机制解析

场景问题:在一个大型分布式系统中,每当启动一个新的服务实例时,系统管理员都会发现服务启动时间较长,且启动过程中资源消耗较大。经过分析,发现这是由于系统中的类加载机制不够高效,导致大量的类需要被重复加载,从而增加了启动时间和资源消耗。为了解决这个问题,我们需要深入了解JVM的类加载机制。知识点重要性:介绍JVM核心知识点之加载:概述的重要性在于,它是理解JVM运行时行为的基础。类加载是JVM执行Java程序的第一步,它决定了哪些类会被加载到JVM中,以及如何加载这些类。

MoneyHacksPro的博客 1112

【JVM】详解类加载机制

对于一个类来说,它的生命周期是这样的: 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化三个步骤对该类进行初始化。所以将这三个步骤称为类加载。 其中连接又分为三步:验证、准备、解析。下面我们来仔细了解一下类加载的过程:当类被加载之后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将java类的二进制代码合并到JVM的运行状态中)。类连接又可分为以下三个阶段:初始化是为类的静态变量赋予正确的初始值,准备阶段

weixin_48271092的博客 3154
上一篇: JVM 类文件结构分析
下一篇: Java并发中偏向锁、轻量级锁和重量级锁的原理
风萧水丶寒
博客等级 码龄11年 6粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值