字节码加载过程

Java类加载过程中的字节码验证机制 本文聚焦Java类加载机制中的"验证阶段",重点讲解其中最复杂的"字节码验证"环节。为什么需要字节码验证?字节码验证的四大核心步骤验证失败时JVM会抛出哪些异常?开发者可能遇到的典型验证错误案例用"机场安检"类比引出字节码验证的核心作用拆解类加载全流程,定位验证阶段的位置详细讲解四大验证步骤(含生活类比+代码案例)分析验证机制的技术实现(类型推导→栈映射表优化)常见验证错误案例与避坑指南类加载流程:加载→验证→准备→解析→初始化字节码验证。 阅读详情

双亲委托

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            //如果没有
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                    //如果父类不空 就交给父类递归
                        c = parent.loadClass(name, false);
                    } else {
                    //当某一个父类为空时就交给BootstrapClassLoad去加载
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    //加载失败就class not find 了
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

启动类加载器(Bootstrap Classloader)

此类加载器为c++所写 native实现,负责jvm核心类的加载即加载位于 JAVA_HOME/lib/rt.jar 文件中

扩展类加载器(Extension Classloader)


扩展类加载器,负责加载 JVM 扩展类,扩展 jar 包位于 JAVA_HOME/lib/ext/*.jar 中,库名通常以 javax 开头。

AppClassLoader


加载自己程序里面的类

自定义类加载


public class MyClassLoader extends ClassLoader {
    private String dirPath;

    @Override
    public String getName() {
        return "MyClassLoader";
    }

    public MyClassLoader(String dirPath) {
        if (!dirPath.endsWith("/") && !dirPath.endsWith("\\")) {
            dirPath += "/";
        }
        this.dirPath = dirPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        String filePath = dirPath + name.replace('.', '/') + ".class";
        byte[] b;
        Path path;
        try {
            path = Paths.get(new URI(filePath));
            b = Files.readAllBytes(path);
            // defineClass将字节数组转换成Class对象
            return defineClass(name, b, 0, b.length);
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
            return null;
        }
    }
}

i++

程序代码

public class Test {
    public static void main(String[] args) {
        int i=0;

        i=i++;
        System.out.println(i);
    }
}

字节码


{
  public com.shard.jdbc.service.impl.Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iload_1     //这里是将局部表中值加载一份到操作栈中
         3: iinc          1, 1 这边加的是局部变量表中的值
         6: istore_1 //将操作栈中的值替换掉索引为1的值
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: iload_1
        11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        14: return
      LineNumberTable:
        line 5: 0
        line 7: 2
        line 8: 7
        line 9: 14
}

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南 本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。 阅读详情

相关推荐

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4669

JVM字节码与类的加载——类的加载过程详解

加载(Loading)阶段、链接(Linking)阶段、初始化(Initialization)阶段、类的使用(Using)、类的卸载(Unloading)

码说芯语的博客 1112

LightRAG实战:从零构建中药知识图谱,解锁六种检索模式效能对比

本文详细介绍了如何使用轻量级RAG框架LightRAG从零构建中药知识图谱的实战过程。通过本地部署环境搭建、开源模型配置与《本草纲目》数据导入,文章重点对比了Naive、Local、Global、Hybrid、Mix和Bypass六种检索模式在中药问答中的效能差异,并提供了可视化图谱与优化心得,为开发者构建专业领域智能问答系统提供了实用指南。

weixin_29096377的博客 177

JVM 类加载机制详解:从字节码到内存的全过程

本文深入解析JVM类加载机制,从加载到卸载的完整生命周期包含七个阶段:加载、验证、准备、解析、初始化、使用和卸载。重点剖析了类加载过程的五个关键阶段(加载、验证、准备、解析和初始化)的工作原理及实现细节,特别是初始化阶段执行类构造器方法的多线程安全特性。详细介绍了JVM三类核心类加载器(启动类、扩展类和应用程序类加载器)及其双亲委派模型的设计原理,该机制通过层级委派确保类加载的安全性和唯一性。最后,通过自定义类加载器示例,展示了如何实现从特定路径加载加密类文件等特殊需求。理解类加载机制对解决类冲突、反射调用

dom_jun的博客 1165

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

Materials Studio与LAMMPS联合作战:如何用msi2lmp.exe完美转换聚合物模型(含PCFF力场配置)

本文详细解析了如何利用msi2lmp.exe工具将Materials Studio中的聚合物模型高效、准确地转换为LAMMPS可识别的data文件,并重点配置PCFF力场。文章提供了从MS模型构建、文件导出到命令行转换、参数调整及转换后验证的全流程实战指南与避坑技巧,旨在帮助研究者解决模型转换中的常见问题,实现跨平台分子动力学模拟的无缝衔接。

weixin_29228781的博客 520

JVM——类与字节码加载篇

类与字节码加载相关内容

Xiaofeng_Lu__的博客 2261

解决TexStudio编写LaTeX论文引用文献问题:正文引用处出现[?],参考文献也不显现

当我们利用LaTeX编写论文时,可能会出现引用参考文献时正文引用处出现?号,肯能的原因及解决方案如下: 问题一 忘记在\end{document}前面放\bibliographystyle{样式}和\bibliography{参考文献bib文件名}: \bibliographystyle{plain} \bibliography{sample} 其中, LaTeX 标准选项及其样式共有以下8种: plain,按字母的顺序排列,比较次序为作者、年度和标题. unsrt,样式同plain,只是按照引用的先后

左手の明天的博客 9529

字节码与类的加载篇--3 类的加载过程详解 -B站尚硅谷JVM课程学习

概述 类的生命周期 类的使用过程 加载(loading)阶段 加载完成的操作 加载:将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型–类模板对象。 加载完成的操作:查找并加载类的二进制数据,生成Class的实例 通过类的全名,获取类的二进制数据流 解析类的二进制数据流为方法区内的数据结构 创建Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口 获取二进制流的方式:只要所读取的字节码符合JVM规范即可,获取之后转换为一个Java.lang.Class实例 类

x18845040365的博客 570

RK3588 部署 YOLO26 目标检测:从环境搭建到 NPU 推理

采集图像(500+ 张,覆盖不同光照和角度)→ 筛选(删除模糊、无目标的图像)→ LabelImg 标注(选择 YOLO 格式)→ 划分 train:val:test = 7:2:1labelImg├── train/├── val/nc: 3类别顺序必须与 LabelImg 标注时一致。YOLO26 在 RK3588 上的部署流程是 PC 端训练 → ONNX 导出(opset=11)→ RKNN 转换(INT8 量化)→ 板端推理。

LXY_LOVE36的博客 418

anaconda navigator 卡在loading application界面一直没有反应解决办法

在打开anaconda navigator 程序的时候,遇到了2个问题。第一个问题:打开的时候弹出提示:There is an instance of Anaconda Navigator already running.第二个问题:程序一直卡在loading application界面一直没有反应。以下是我的解决办法,有效果。

猿小白的博客 4384

让宝贝舍友理解JVM 第二弹 上(类加载子系统)

这篇文章我们就开始学习JVM第一个结构,类加载子系统。

weixin_44824500的博客 1054

2025_NIPS_RAGRouter: Learning to Route Queries to Multiple Retrieval-Augmented Language Models

该研究聚焦检索增强生成(RAG)场景下的大语言模型(LLM)路由问题,提出了首个RAG感知的路由框架RAGRouter。核心解决现有路由方法依赖静态参数知识、忽略检索文档动态影响的缺陷,通过融合文档嵌入、RAG能力嵌入与对比学习,捕捉RAG引发的模型知识表征变化,为每个查询-文档对选择最优LLM。实验覆盖5个知识密集型任务、15个开源/闭源LLM,验证了RAGRouter在性能上超越最佳单LLM和非RAG感知路由方法,且通过阈值机制实现低延迟约束下的性能-效率平衡。

UnknownBody_2的博客 273

jvm加载字节码过程

前面提到,java代码编译成字节码后,由jvm加载并执行,那么jvm加载的过程是由类加载子系统来执行的。java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最后形成可以被虚拟机直接使用的java类型,这个过程被称为虚拟机的类加载机制。 加载过程 类从被加载到内存到卸出内存,分为以下几个过程 加载 连接 验证 准备 解析 初始化 使用 卸载 1.加载 这里的加载指的是加载过程中把字节码从文件中的结构加载到内存中的数据结构的一步,而不是完整的加载过程。这个是运

bpk_2的博客 738

STM32F407中文手册

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

蓝牙模块HM-10手册

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

JVM 类加载过程与字节码执行深度解析

核心流程类加载器收到加载请求时,先委托父加载器处理父加载器递归向上委托,直至引导类加载器若父加载器无法加载(返回 null),当前加载器尝试自行加载设计目的避免类重复加载:确保仅由引导类加载器加载一次保证类安全性:防止用户自定义替代核心类破坏场景1. 线程上下文类加载器(Thread Context ClassLoader):如 JDBC 驱动需由应用类加载器加载,突破双亲委派(2. 模块化系统(JDK 9+ JPMS):通过显式声明依赖,允许跨模块加载3. 热部署框架(如 OSGi)

kfashfasf的博客 851

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM——字节码文件的加载过程(类的加载过程)以及双亲委派机制

JVM运行加载字节码文件 简图如下 类加载器子系统 类加载器: 负责从文件系统(简单说就是硬盘)或者网络上加载class文件,class文件在文件开头有特点的标识。 ClassLoader只负责class文件的加载,只要是符合JVM对字节码文件规范的要求就可以,至于它是否可以运行,由执行引擎决定。 加载的类信息存放在方法区(一块内存空间),除了类信息之外,方法区中还会存放运行时常量池信息,可能还会包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射) 例如一个磁盘

保暖透气大裤衩LeoLee的博客 1536

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 线程安全笔记
下一篇: hadoop主要组建简写笔记
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值