JVM-类加载机制

新手学习Vivado XDMA (1) - 配置详细分析 PCIe 在 Vivado XDMA 中的配置分析。 阅读详情

Class文件概述

我们知道,java代码是可以一次编译,到处运行的,其主要是因为运行在java虚拟机上,不同的操作系统,只要安装了java虚拟机,就能运行编译之后的java代码。

将编译之后的class文件解析出来,其实里面就是一堆的16进制字节。下面的图是class文件的结构。

类的加载过程

在这里插入图片描述

1、加载

①、通过全限定名获取此类的二进制字节流。

  • 生成class文件字节码的方式有很多种,从网络中读取,将jsp文件转换为class文件等等。

②、将该二进制字节流代表的静态存储结构转化为方法区运行时的数据结构。
③、生成该类的java.lang.Class,作为访问入口。

  • 对于 hotSpot 而言,Class对象比较特殊,它虽然是对象,但是它并没有存储在堆中,而是在存储在方法区中。

2、验证

该阶段主要是验证加载的二进制字节流文件是否符合Class文件的规范。
是否能被当前版本的虚拟机所理解。

①.文件格式的验证

  • 是否以魔数 0xAEDADSDF开头
  • 常量池中的常量类型是否有不被支持的常量类型
    …

②.元数据的验证

  • 这个类是否有父类(除了Object类之外,其余的类都应该有父类)
    …

③.字节码验证

  • 字节码指令跳转是否会有问题

④.符号引用验证


3、准备

这个阶段是正式仅为类变量(static修饰的变量)进行内存分配的过程。而不包括
实例变量,实例变量是在对象实例化的时候随着对象一起分配至java堆中的。

public static int value = 123;
这个变量 value 在准备阶段后的初始值为0,而不是 123。
因为这时候尚未开始执行任何java方法,把123赋值给value是在程序初始化之后进行的。

public static final int value = 123;
添加了final之后就会不一样,添加了final之后,在字段属性表中是属于常量,在准备阶段就会将value赋值为123

4、解析

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

4、初始化

类初始化阶段是执行类构造器clinit<>()的过程。

clinit<>() , 类构造器方法,在jvm第一次加载class文件时调用,因为是类级别的,所以只加载一次,是编译器自动收集类中所有类变量(static修饰的变量)和静态语句块(static{}),中的语句合并产生的,编译器收集的顺序,是由程序员在写在源文件中的代码的顺序决定的。

init<>(),实例构造器方法,在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。

  • 如果代码中存在继承关系,则优先加载父类的类变量,然后在加载子类的类变量
  • 只有父接口中存在变量的时候,clinit<>()才会被初始化。

类与类加载器

双亲委派模型

对于java虚拟机来说,存在2种不同的类加载器。
一种是启动类加载器(bootStrap ClassLoader),是虚拟机自身的一部分。
另外一种是 其他类加载器,是由java实现的。独立与虚拟机外部,全部都继承与抽象类ClassLoader

在这里插入图片描述
上图展示的是类加载器的双亲委派模型

  • 启动类加载器
    它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar),是用原生代码来实现的,并不继承自java.lang.Classloader。
  • 扩展类加载器
    用来加载Java的扩展库(JAVA_HOME/JRE/EXT/*.jar),Java虚拟机的实现会提供一个扩展库目录。该加载器在此目录里面查找并加载Java类。
  • 应用类加载器
    它根据Java应用程序的类路径(classpath,java.class.path)路径类。一般来说,系统(应用程序)类都是由它来加载。

双亲委派模型的工作过程:
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是委派给父类加载器去完成加载。只有父类加载器反馈自己无法加载这个请求的时候,子类加载器才会尝试自己去加载。

使用双亲委派模型的好处:
1、保证java核心库的类型安全。
2、Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。

探索CompletableFuture:高效异步编程的利器 随着现代软件系统的复杂性和用户需求的多样化,异步编程成为了提升系统性能和响应速度的重要手段。在Java领域,CompletableFuture作为Java 8引入的新特性,提供了强大的异步编程能力,极大地简化了多线程和并发任务的处理。本文将深入探讨CompletableFuture的基本功能和使用方法,介绍如何利用其提升程序的并发性能和代码的可维护性。 阅读详情

相关推荐

SAP中常见的Debug方式

原文链接:https://mp.weixin.qq.com/s/wT4kThFKYV0PQYhCqpXRWg 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望转发关注,谢谢 导读 SAP系统在企业的应用时,都不会只使用标准功能。 通常情况下,基于特殊的行业需求,以及某些业务部门的管理需求等,都会额外开发出一些增强,报表,对话功能,接口等,从而保证系统的正常运转。 标准知识的逻辑,我们...

Kerwin-G的博客 1万+

深入JVM类加载机制

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

Floating Cat 2万+

Dify工作流自动化:如何用Trae AI助手10倍提升你的开发效率(含避坑指南)

本文详细介绍了如何利用Trae AI助手自动化生成Dify工作流,实现开发效率的10倍提升。通过构建DSL示例库、精准需求描述和四步实战法,开发者可将重复的配置工作交给AI,快速生成可运行的工作流,并提供了关键的避坑指南。

weixin_29062865的博客 370

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

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

阿华的博客 1300

使用单调栈求解最大矩形面积问题的C++实现

通过本文的介绍,我们详细讲解了如何使用单调栈求解砖墙中最大矩形面积的问题,并提供了完整的C++代码实现。希望通过本文的学习,你能掌握单调栈的基本概念及其在实际问题中的应用。如果你有任何疑问或建议,欢迎在评论区留言交流。

m0_57781768的博客 813

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

JVM类加载机制

这些内存都将在方法区中分配。

xxxmine的博客 1021

3GPP LTE/NR信道模型

CDL(Clustered Delay Line):簇延迟线模型,包括CDL-A、CDL-B、CDL-C三个用于NLOS的信道模型,以及CDL-D、CDL-E两个用于LOS的信道模型。

LinkEverything的博客 1万+

JVM 类加载机制详解

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

面团到油条的成长日记 1285

从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)

本文是一份企业级AI Agent构建手册,主要面向企业技术负责人、AI产品经理和后端开发工程师。手册详细介绍了如何在阿里云百炼平台上搭建企业智能体应用的全流程,包括环境准备、知识库构建、智能体创建、工具集成、工作流编排等核心环节。重点内容包括: 准备工作:阿里云账号注册、百炼服务开通、免费额度领取、API Key管理 知识库构建:文档格式要求、内容优化原则、RAG系统搭建 智能体开发:Agent创建、工具集成、复杂业务工作流设计 生产部署:多渠道接入、监控运维、安全治理 成本控制:Token预算管理、选型决

u010323587的专栏 1083

YOLOv8改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 58

JVM类加载机制解析

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

MoneyHacksPro的博客 1111

osg点云加载与渲染

osg点云加载与渲染

cangqiongxiaoye的博客 821

JVM类加载机制深度解析

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Tomcat类加载机制与JVM类加载机制对比

类加载   在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载。   比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。   因此使用哪种类加载器、在什么位置加载类都是JVM中重要的知识。 JVM类加载   JVM类加载采用 父类委托机制,如下图所示:   JVM中包括集中类加载器:   1 BootStrapClassLoader 引导类加载器   2 ..

1 Byte 的博客 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JVM类加载机制、调优

类加载机制、双亲委派模型、处理内存泄漏、OOM等问题方法

TIANLEeeee的博客 1371

STM32F407中文手册

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

JVM 的类加载机制原理

文件加载到内存中,并将其转换为 JVM 可以使用的 Java 类型。类加载过程包括加载、链接(验证、准备、解析)和初始化几个阶段。类加载器遵循双亲委派模型,保证了类加载的顺序和安全性。文件(包含 Java 字节码)加载到内存,并对其进行校验、解析、初始化,最终转换为 JVM 可以直接使用的 Java 类型的过程。JVM 的类加载机制是指 JVM 将。JVM 的类加载机制负责将。

专注于技术分享 1274

Tomcat的类加载机制和JVM的类加载机制

介绍了JVM的各个类加载器和JVM的双亲委派机制,同时说明SPI机制为何不遵守双亲委派机制。同时对比Tomcat的类加载机制

不会骑摩托的程序员不是好的摄影师 1373

jvm类加载机制探讨

一、类加载流程 jvm中类加载流程分为5个部分:加载loading,验证Verification,准备preparation,解析resolution,初始化initialization。 1、加载阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对 象, 作为方法区这个类的各种数据的入口。可从class文件、Zip报(jar\war等)、运行时计算生成(动态代理)、JSP转换成的对应class文件等。主要完成三件事: 1)通过一个类的全限定名来获取定义此类的二进制字节流; 2)

xiangbole的博客 2244

【JVM】详解类加载机制

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

weixin_48271092的博客 3153

JVM深入了解之JVM的类加载机制!

这里的类加载器之间的父子关系一般不是以继承关系实现的,而是用组合实现的。如果一个类接受到类加载请求,他自己不会去加载这个请求,而是将这个类加载请求委派给父类加载器,这样一层一层传送,直到到达启动类加载器(Bootstrap ClassLoader)。那么变量value在准备阶段过后的初始值为0,而不是3,因为这时候尚未开始执行任何Java方法,而把value赋值为3的putstatic指令是在程序编译后,存放于类构造器()方法之中的,所以把value赋值为3的动作将在初始化阶段才会执行。

mxt51220的博客 981

JVM 类加载机制

类加载器作用范围加载路径启动类加载器(Bootstrap)加载 JVM 核心类(比如JAVA_HOME/jre/lib/rt.jar 等核心 jar扩展类加载器(Extension)加载 JVM 扩展类JAVA_HOME/jre/lib/ext 目录应用程序类加载器(App)加载用户编写的类和第三方 jar应用 classpath 路径要不要我帮你补充一份类加载器工作流程示意图,直观展示双亲委派模型的执行顺序?当前文件内容过长,豆包只阅读了前 33%。

2301_78125917的博客 1191

JVM类加载机制【总结】

一、JVM类加载机制: JVM类加载机制分为五个部分:加载、验证、准备、解析、初始化,下面我们分别来看一下这五个过程。 1、加载: 加载是类加载过程中的第一个阶段:这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从Zip包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)。 2、验证: 这一

单枪匹码 694

JVM面试 类加载机制

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

分享技术,享受生活 7389
上一篇: 责任链设计模式
下一篇: Prometheus-监控系统
虎娃Aa
博客等级 码龄10年 24粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值