JVM——即时编译
分层编译模式:动态平衡启动速度与执行效率
分层编译是现代JVM(如HotSpot、GraalVM)实现高性能的核心策略之一,其核心思想是根据代码的执行热度动态选择不同的编译层次,实现启动速度与运行效率的最佳平衡。以HotSpot虚拟机为例,其分层编译架构通常包含以下五个层次:
-
第0层:纯解释执行
特点:完全依赖解释器逐行执行字节码,不开启任何性能监控(Profiling)。
适用场景:程序启动初期,快速加载并执行代码,避免编译延迟。
优势:启动速度极快,内存占用低,适合资源受限的嵌入式系统或短生命周期应用。
-
第1层:C1基础编译
特点:使用客户端编译器(C1)将字节码编译为本地代码,执行简单稳定的优化(如方法内联、常量传播),但不收集性能数据。
触发条件:方法调用次数或循环回边次数超过默认阈值(如1500次)。
优势:编译速度快,能在程序启动后迅速提升部分代码的执行效率。
-
第2层:C1有限监控编
特点:仍使用C1编译器,但开启方法调用次数和循环回边次数的统计。
触发条件:在第1层基础上,进一步收集有限的性能数据,为后续优化提供依据。
作用:初步识别热点代码,为更高层次的编译做准备。
-
第3层:C1全量监控编译
特点:C1编译器收集完整的性能数据,包括分支跳转频率、虚方法调用版本等。
触发条件:方法调用次数或循环回边次数达到更高阈值(如10000次)。
作用:为服务端编译器(C2)提供详细的Profiling信息,支持更复杂的优化。
-
第4层:C2深度优化编译
特点:使用服务端编译器(C2)进行激进优化,包括全局优化、循环展开、向量化等。
触发条件:在第3层收集足够数据后,C2编译器介入生成高度优化的机器码。
优势:生成代码执行效率高,适合长时间运行的服务端应用。
分层编译的协同机制
-
动态调整:各层次之间并非固定,JVM会根据代码热度动态调整编译层次。例如,当某个方法的执行频率下降时,可能会回退到较低层次以节省资源。
-
代码缓存管理:分层编译需要更大的代码缓存(默认240MB),以存储不同层次的编译结果。若缓存不足,JVM会发出警告并可能降级编译策略。
-
GraalVM的改进:GraalVM引入Graal编译器作为C2的替代者,采用更先进的中间表示(Sea-of-Nodes)和优化算法,支持部分逃逸分析、激进预测性优化等,在某些场景下性能超越C2。
分层编译的典型应用场景
-
微服务架构:启动时通过C1快速编译,快速响应请求;运行稳定后,C2对核心业务逻辑进行深度优化,提升吞吐量。
-
大数据处理:循环密集型任务(如MapReduce)通过OSR编译在运行时动态优化,显著减少执行时间。
-
移动端应用:结合ART的AOT编译与JIT动态优化,平衡安装速度与运行性能。
即时编译的触发:热点代码的精准识别
即时编译的触发依赖于热点代码的探测机制。HotSpot采用基于计数器的热点探测方法,为每个方法维护两个计数器:
-
方法调用计数器(Invocation Counter)
作用:统计方法被调用的次数。
阈值:默认1500次(可通过-XX:CompileThreshold调整)。
触发条件:当调用次数超过阈值时,触发标准即时编译(即整个方法被编译)。
-
回边计数器(Back Edge Counter)
作用:统计循环体的执行次数(回边指循环边界的跳转指令)。
阈值计算:InterpreterBackwardBranchLimit = (CompileThreshold * (OnStackReplacePercentage - InterpreterProfilePercentage)) / 100,默认约10700次。
触发条件:当循环次数超过阈值时,触发栈上替换(OSR)编译,仅优化循环体部分。
热点探测的优化策略
-
自适应调整:JVM会根据程序运行情况动态调整计数器阈值。例如,若某个方法调用频繁但执行时间短,可能降低阈值以提前编译。
-
分层触发:不同编译层次的触发条件不同。例如,C1编译可能在调用次数达到1500次时触发,而C2编译需要更高的阈值(如10000次)。
-
OSR编译的特殊性:OSR编译允许在方法执行过程中动态替换栈帧,避免重新编译整个方法的开销。例如,当循环次数超过阈值时,JVM会将循环体编译为本地代码,并替换当前栈帧,后续迭代直接执行优化后的代码。
热点探测的实现细节
-
安全点(Safepoint):编译操作必须在安全点进行,此时所有线程暂停,确保状态一致。安全点通常位于方法调用、循环回边等位置。
-
异步编译:热点代码的编译由后台线程异步执行,避免阻塞主线程。例如,C1和C2编译器分别由不同的线程池处理。
-
阈值调整参数:通过
-XX:Tier3CompileThreshold
等参数可定制各层次的触发条件,以适应不同应用的需求。
OSR编译:循环优化的核心技术
栈上替换(On-Stack Replacement,OSR)是即时编译中针对循环优化的关键技术,允许在循环执行过程中动态替换为优化后的本地代码,而无需重新编译整个方法。
OSR的触发条件
循环次数阈值:当循环回边次数超过InterpreterBackwardBranchLimit
(默认约10700次)时触发。
编译可行性:JVM需确保循环体的编译结果可以无缝替换当前栈帧,包括局部变量和操作数栈的状态保存与恢复。
OSR的实现步骤
状态捕获:解释器在执行循环时,记录当前栈帧的局部变量、操作数栈和程序计数器(PC)。
代码生成:C1或C2编译器针对循环体生成优化后的本地代码,并生成一个OSR入口点。
栈帧替换:当循环再次执行到入口点时,JVM将解释执行的栈帧替换为编译后的栈帧,后续迭代直接执行本地代码。
状态恢复:编译后的代码需根据捕获的状态恢复局部变量和操作数栈,确保执行连续性。
OSR的关键挑战
局部变量映射:解释执行的局部变量可能存储在栈或寄存器中,编译后的代码需正确映射这些变量的位置。
异常处理:OSR编译后的代码需处理可能抛出的异常,并与解释执行的异常处理逻辑兼容。
代码缓存管理:OSR编译生成的代码需存储在代码缓存中,需合理分配空间以避免缓存溢出。
OSR的性能影响
优化效果:OSR可显著减少循环的执行时间。例如,在某电商系统中,循环密集型任务通过OSR优化后,吞吐量提升28%。
编译开销:OSR编译需要额外的时间和资源,可能对启动性能产生轻微影响。
调试复杂性:OSR导致的代码替换可能使调试工具(如断点)的行为变得复杂,需特殊处理。
Profiling:优化决策的核心依据
Profiling(性能分析)是即时编译的核心支撑技术,通过收集代码执行时的动态数据,指导编译器进行针对性优化。HotSpot的Profiling主要包括分支Profile和类型Profile。
分支Profile的收集与应用
收集方式:
-
静态分析:在解释执行或C1编译阶段,统计条件跳转指令的分支频率。
-
动态监控:C1编译后的代码在执行时,实时记录分支跳转的历史数据。
优化策略:
-
分支预测:根据历史数据预测分支走向,减少流水线冲刷。例如,若某分支90%的时间为真,编译器可优先执行该路径。
-
分支消除:对于始终为真或假的分支,直接移除条件判断。例如,
if (true) { ... }
可简化为直接执行代码块。 -
代码重排:将高频执行的基本块(Basic Block)相邻放置,提高CPU缓存命中率。例如,使用BOLT工具根据分支频率重排代码布局,减少缓存未命中。
类型Profile的收集与应用
收集方式:
-
虚方法调用记录:在解释执行或C1编译阶段,记录虚方法调用的实际类型。
-
动态类型监控:C1编译后的代码在执行时,统计方法调用的参数类型分布。
优化策略:
-
类型特化:根据类型Profile生成特定类型的优化代码。例如,若
List
的实现类90%为ArrayList
,编译器可将List.get()
调用直接替换为ArrayList.get()
,避免虚方法开销。 -
去虚拟化:对于类型单一的虚方法调用,直接内联具体实现,消除动态分派的开销。
-
内联决策:结合类型Profile调整内联策略。例如,若某方法的参数类型变化频繁,可能选择不内联以避免去优化风险。
Profiling的实现细节
数据存储:分支Profile和类型Profile存储在JVM的内部数据结构中,如ProfileData
对象。
数据更新:Profiling数据在代码执行时动态更新,确保编译器获取最新的执行信息。
优化粒度:Profiling可精确到方法、循环或基本块级别,支持细粒度的优化决策。
Profiling的局限性
数据滞后性:Profiling数据反映的是历史执行情况,可能与当前执行路径不完全匹配。
空间开销:大量的Profiling数据需要占用内存,可能影响JVM的资源分配。
去优化风险:基于Profiling的优化假设可能不成立(如类型变化),导致去优化操作,增加运行时开销。
基于分支Profile的优化:提升条件语句效率
分支预测和优化是提升程序性能的关键手段,尤其在循环和条件判断密集的代码中。基于分支Profile的优化主要包括以下策略:
分支预测优化
静态预测:
-
Always Taken:假设所有分支都跳转,适用于循环条件。
-
Backward Taken, Forward Not Taken (BTFN):假设向后跳转的分支(如循环)总是跳转,向前跳转的分支不跳转。
动态预测:
-
两比特计数器(Two-bit Counter):记录分支最近两次的执行结果,预测未来走向。例如,若分支连续两次跳转,则预测下次跳转。
-
全局历史表(Global History Table):结合全局分支历史进行预测,适用于长距离依赖的分支。
分支消除与简化
常量条件:若条件表达式在编译时已知结果,直接移除条件判断。例如:
if (false) {// 永远不会执行的代码
}
编译器可直接删除该分支。
条件合并:将多个条件判断合并为一个,减少分支数量。例如:
if (a > 0) {if (b < 10) {// 代码块}
}
可优化为:
if (a > 0 && b < 10) {// 代码块
}
代码重排与布局优化
基本块重排:将高频执行的基本块相邻放置,提高CPU缓存命中率。例如,将if
分支的真路径和假路径按执行频率排序。
循环展开:通过增加循环体的指令数量,减少循环次数和分支判断。例如,将循环展开两次:
for (int i = 0; i < n; i += 2) {process(i);process(i + 1);
}
减少循环条件的判断次数。
预测执行(Speculative Execution)
分支预判:在分支条件未确定前,提前执行可能的路径。例如,若预测分支为真,提前执行真路径的指令,并在条件确定后验证结果。
推测加载:提前加载可能使用的数据到缓存,减少内存访问延迟。例如,在循环中提前加载下一次迭代所需的数据。
实际应用案例
数据库查询优化:在SQL查询引擎中,根据分支Profile调整执行计划,选择更高效的索引或扫描方式。
游戏引擎:在碰撞检测算法中,通过分支预测和代码重排提升实时响应性能。
金融交易系统:在高频交易场景中,通过分支消除和预测执行减少延迟,提升吞吐量。
基于类型Profile的优化:消除动态分派开销
类型Profile的优化主要针对虚方法调用和动态类型绑定,通过减少运行时的动态分派开销,提升执行效率。以下是主要优化策略:
类型特化(Type Specialization)
原理:根据类型Profile生成特定类型的优化代码。例如,若某虚方法List.get(int)
的调用中,90%的List
实例为ArrayList
,编译器可生成ArrayList.get(int)
的直接调用,避免虚方法开销。
实现步骤:
-
收集类型Profile,统计方法调用的实际类型分布。
-
为高频类型生成特化代码,并保留通用版本作为后备。
-
在调用点插入类型检查,若实际类型匹配特化版本,则执行优化代码;否则回退到通用版本。
去虚拟化(Devirtualization)
原理:对于类型单一的虚方法调用,直接内联具体实现,消除动态分派。例如,若某虚方法Animal.sound()
的调用中,所有Animal
实例均为Dog
,编译器可将调用替换为Dog.sound()
的直接调用。
触发条件:
-
类型Profile显示方法调用的实际类型高度集中。
-
方法体较小,内联收益大于开销。
内联优化与类型Profile结合
动态内联:根据类型Profile调整内联策略。例如,若某方法的参数类型变化频繁,可能选择不内联以避免去优化;若类型稳定,则积极内联。
类型驱动的内联:内联时考虑参数类型,生成特定类型的内联代码。例如,List.add(Object)
可根据实际参数类型内联为ArrayList.add(String)
或LinkedList.add(Integer)
。
类型继承结构优化
常量传播:若父类方法被覆盖,且子类方法在运行时占主导地位,编译器可将父类方法的调用替换为子类实现。
字段内联:若子类字段未被覆盖,可直接访问子类字段,避免动态查找。
实际应用案例
ORM框架:在Hibernate中,根据类型Profile优化对象加载时的反射调用,减少动态代理的开销。
容器类库:在Java集合框架中,根据类型Profile优化Iterator
的实现,例如将ArrayList
的迭代器直接替换为数组访问。
深度学习框架:在TensorFlow中,根据张量类型Profile优化算子选择,例如针对float32
和int8
数据生成不同的计算内核。
去优化:应对优化假设的失效
去优化(Deoptimization)是即时编译中的关键机制,当优化假设不成立时,将代码从编译执行回退到解释执行或重新编译,确保程序正确性。以下是去优化的常见场景和实现机制:
去优化的触发条件
类型变化:若虚方法调用的实际类型超出类型Profile的预期,导致去虚拟化失败。
分支预测错误:若分支执行路径与Profile数据不符,导致激进优化失效。
加载新类:类加载后,方法的继承结构发生变化,影响已编译代码的逻辑。
罕见陷阱(Uncommon Trap):某些异常情况(如数组越界)在优化代码中未处理,需回退到解释执行。
去优化的实现步骤
-
状态保存:在编译代码中插入去优化点,保存当前栈帧的局部变量、操作数栈和程序计数器。
-
回退逻辑:当触发条件满足时,JVM将执行权转移到解释器,并根据保存的状态恢复执行。
-
重新编译:若去优化频繁发生,JVM可能重新编译代码,调整优化策略。
去优化的性能影响
单次开销:去优化操作本身会带来一定的性能损失,通常在微秒级。
频繁去优化:若代码频繁触发去优化,可能导致性能下降。例如,动态类型语言(如JavaScript)中,类型变化频繁可能导致去优化成为主要开销。
优化策略调整:JVM会根据去优化的频率动态调整编译策略,例如降低优化级别或增加Profiling的频率。
去优化的案例分析
逃逸分析失效:若对象的作用域超出预期(如被外部线程访问),逃逸分析的优化(如栈上分配)失效,需回退到堆分配。
虚方法调用类型变化:若某个虚方法的调用在运行时出现新的子类,导致去虚拟化失败,需回退到动态分派。
激进优化假设不成立:例如,编译器假设某分支永远不会执行,但实际执行时触发该分支,导致去优化。
减少去优化的策略
限制动态类型使用:在静态类型语言中,避免过度使用反射和动态代理。
预热阶段优化:在程序启动后,主动执行关键路径代码,收集足够的Profiling数据,减少运行时去优化。
参数调优:通过-XX:DeoptimizationWorkers
等参数调整去优化线程数,平衡响应速度与资源消耗。
从JIT到AI驱动的编译优化
1. 即时编译的发展历程
-
早期阶段(1990s-2000s):以HotSpot的C1/C2编译器为代表,实现基本的分层编译和热点优化。
-
中期阶段(2010s):GraalVM的出现,引入多语言支持和更先进的优化算法(如部分逃逸分析)。
-
近期阶段(2020s):AI技术的应用,如机器学习模型用于编译决策,硬件协同优化(如GPU加速编译)。
2. 现有技术的局限性
-
优化策略的静态性:现有优化策略基于历史数据,无法实时适应动态变化的运行环境。
-
硬件协同不足:JIT编译器对新型硬件(如NPU、FPGA)的支持有限,未充分发挥异构计算的潜力。
-
去优化的开销:频繁的去优化可能抵消部分编译优化的收益,尤其在动态语言中。
3. 未来发展趋势
-
AI驱动的编译优化:
-
机器学习模型:使用深度学习预测热点代码、优化策略,提升编译决策的准确性。例如,小米的AI编译器利用强化学习优化代码布局,启动速度提升60%。
-
自动调优:根据硬件状态(如CPU负载、内存带宽)动态调整编译策略,实现自适应优化。
-
-
硬件协同优化:
-
异构计算:将计算任务分配到CPU、GPU、NPU等不同设备,JIT编译器生成跨平台的优化代码。例如,昇思MindSpore通过张量重排布和自动微分支持GPU加速编译。
-
近存计算:结合HBM高带宽内存和存算一体架构,减少数据搬运能耗,提升计算密集型任务的效率。
-
-
更高效的去优化机制:
-
增量编译:仅重新编译受影响的代码部分,减少编译开销。
-
预测性去优化:通过机器学习预测可能触发去优化的场景,提前调整优化策略。
-
-
多语言统一编译:
-
GraalVM的演进:支持更多语言(如Rust、Python)的即时编译,实现跨语言的无缝优化。
-
泛在智能:在边缘设备上实现轻量级JIT编译,结合AI Agent实现端云协同优化。
-
总结
即时编译是现代高性能计算的基石,其技术体系从分层编译、热点探测到去优化,不断演进以适应新的应用场景和硬件架构。未来,随着AI和硬件技术的发展,JIT编译将更加智能化、自适应化,实现从“代码优化”到“系统级协同优化”的跨越。
相关文章:
JVM——即时编译
分层编译模式:动态平衡启动速度与执行效率 分层编译是现代JVM(如HotSpot、GraalVM)实现高性能的核心策略之一,其核心思想是根据代码的执行热度动态选择不同的编译层次,实现启动速度与运行效率的最佳平衡。以HotSpot虚…...
武汉火影数字|数字科技馆打造:开启科技探索新大门
足不出户,就能畅游科技的奇幻世界,你相信吗?数字科技馆就能帮你实现!在这个数字化的时代,数字科技馆如同一颗璀璨的新星,照亮了我们探索科学的道路。 那么,数字科技馆究竟是什么呢? …...
升级 Azure Kubernetes 服务群集的关键注意事项
升级 Azure Kubernetes 服务 (AKS) 集群不仅是为了保持最新状态,更是为了保护您的工作负载、提升性能并降低运营风险。但如果操作不当,可能会导致停机、工作负载中断,甚至访问问题。 在本指南中,我们将介绍: 生产环境…...
数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
Go语言是一门静态强类型语言,所有变量在编译时必须明确其数据类型。本章将详细介绍Go的基础数据类型,帮助你理解并正确使用它们。 一、数据类型分类总览 Go 的基础数据类型可以分为以下几类: 类型分类代表类型示例布尔类型booltrue, false整…...
单片机-STM32部分:9-1、触控检测芯片
飞书文档https://x509p6c8to.feishu.cn/wiki/ILBsw4EaQiWaUukWrxEcO4XZnXc 传统物理按键 原理 玻璃盖板下通过一个触摸PAD连接到触摸芯片中,触摸PAD可以用PCB铜箔、金属片、平顶圆柱弹簧、导电棉、导电油墨、导电橡胶、导电玻璃的ITO层等。 当有人体手指靠近触摸按…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作 JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识…...
CSS display: none
在 CSS 中,display: none; 是一个用于控制元素显示与隐藏的属性值,其核心作用是完全从文档流中移除元素,使元素在页面中不占据任何空间,也不会被渲染。以下是详细解释: 核心作用 隐藏元素:使元素在页面中…...
vison transformer vit 论文阅读
An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...
dropout层
从你提供的图片来看,里面讨论了 Dropout 层,让我为你解释一下它的工作原理和作用。 Dropout 层是什么? Dropout 是一种常用的正则化技术,用于避免神经网络的 过拟合(overfitting)。过拟合是指模型在训练数…...
openssl中BIO的使用
BIO是OpenSSL的一个重要的结构和概念,是对数据IO与传递处理的一种类型抽象和功能封装,这里所说的数据IO与传递的“介质”包括:内存、文件、日志、标准设备、网络socket等,“处理”包括简单、加/解密、摘要、ssl协议下的读/写等的数…...
电动汽车充电设施可调能力聚合评估与预测
电动汽车充电设施可调能力聚合评估与预测 项目概述 本项目基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春),实现了电动汽车充电设施可调能力的聚合评估与预测方法。 主要文件 real_data_model.m: 使用真实数据实现LSTM线…...
Git clone时出现SSL certificate problem unable to get local issuer certificate
正确解决方法 git config --global http.sslVerify false错误解决方法:(主要是看错了嘿嘿,但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…...
requests库
模拟请求获取网页源代码 如下 import requestsr requests.get(https://spa1.scrape.center/page/1) print(r.text) 源码如下 GET请求 示例网站为 https://httpbin.org import requests r requests.get(https://httpbin.org/) print(r.text) 所显示的结果如下 {"a…...
基于springboot的海洋环保知识分享系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表
1 概述 ADL3000-E-A 是一款为供电系统、工矿企业以及公用事业单位设计的智能电表,用于计算耗电量并管理用电需求。它具备高精度、体积小以及安装简便的特点。它将所有电气参数的测量与综合电能计量及管理功能集成在一起,可提供过去 12 个月的各类数据&a…...
红黑树算法笔记
文章目录 红黑树 (Red-Black Tree) 学习笔记0. 节点结构与哨兵节点1. 什么是红黑树?2. 红黑树的五个核心性质3. 为什么需要红黑树?4. 红黑树的基本操作a. 查找 (Search)b. 插入 (Insert)c. 删除 (Delete) 5. 维护平衡的关键操作a. 变色 (Recoloring)b. 旋…...
【Axios】解决Axios下载二进制文件返回空对象的问题
【Axios】解决Axios下载二进制文件返回空对象的问题 问题背景 在一个基于Vue 3的项目中,我们使用Axios下载Excel文件,但遇到了一个奇怪的问题:文件能成功下载下来,但打开时显示内容为[object Object]无法使用。 当我们执行下载代码: const response = await downloadT…...
2.MySQL数据库操作
一.MySQL数据库介绍 数据库目前标准指令集是SQL,即结构化查询语言。SQL语言主要由以下几部分组成 DDL(数据定义语言):用来建立数据库、数据库对象和定义字段,如create、alter、drop。 DML(数据操纵语言&…...
01.three官方示例+编辑器+AI快速学习webgl_animation_keyframes
实例:examples/webgl_animation_keyframes.html 在这里插入图片描述 重点关注: AnimationMixer:管理模型的所有动画AnimationClip:表示一个完整的动画ClipAction:控制动画的播放状态(播放、暂停、速度等&am…...
在 Spring Boot 中实现动态线程池的全面指南
动态线程池是一种线程池管理方案,允许在运行时根据业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),以优化资源利用率和系统性能。在 Spring Boot 中,动态线程池可以通过 Java 的 ThreadPoolExecut…...
餐饮行业新风口:上门厨师服务系统的技术实现路径
上门做饭正在成为下一个万亿级风口!当外卖平台被预制菜攻陷,当年轻人对着料理包无可奈何,一个全新的餐饮模式正在悄然崛起。 我们的市场调研显示,83%的消费者无法分辨外卖是否使用预制菜,76%的年轻人愿意为透明烹饪过程…...
odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
文章目录 问题描述解决思路正确的去除 git 跟踪 pyc文件的做法 问题描述 查看本地 stash 列表 stash 后有很多 pyc 文件都被 git 追踪了,这样不合理,而且等 unstash 的时候就会有问题 解决思路 尝试方法: 递归地删除指定文件夹及其子目录中…...
线程同步机制
synchronized 实现线程同步的关键字,用来防止多个线程同时访问某个代码块或方法,避免并发冲突和数据不一致。通过持有一把唯一的对象锁,谁拿到了谁就能执行,谁没拿到只能等待锁释放。 1. 修饰实例方法(锁当前实例&…...
YOLO目标检测算法
文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…...
【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
比赛传送门: 本场比赛开始时题面存在一些问题,私密马赛! A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
1.3.2 linux音频PulseAudio详细介绍
PulseAudio 是一个在 Linux 及其他类 Unix 操作系统中广泛使用的声音服务器(Sound Server),它为不同的音频应用程序提供了一种中间层,以方便管理和控制音频流。下面将详细介绍 PulseAudio 的相关内容,包括其基本概念、…...
8.1.Kubernetes进阶
目录 一、Kubernetes核心原理深度解析 架构设计精髓 • 控制平面组件(API Server、etcd、Controller Manager、Scheduler)协作流程 • 数据平面(kubelet、容器运行时、CNI/CSI插件)核心工作机制 API对象与声明式模型 • CRD&…...
electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
我说一下 react 结合 electron 如果打包和使用,以及其中可能会遇到的问题,这里只做简单功能的演示 我们先通过 cra 创建一个 react 项目,然后安装相关依赖,之后启动 npx create-react-app react_electron cd react_electron np…...
C++23 views::chunk_by (P2443R1) 详解
文章目录 引言C23 范围库概述范围视图(Range Views)范围算法(Range Algorithms)范围适配器(Range Adapters) std::views::chunk_by 介绍基本概念特性使用场景 示例代码简单示例自定义谓词示例 总结 引言 在…...
MySQL核心内容【持续更新中】
MySQL核心内容 文章目录 MySQL核心内容1.MySQL核心内容目录2.MySQL知识面扩展3.MySQL安装4.MySQL配置目录介绍Mysql配置远程ip连接 5.MySQL基础1.MySQL数据类型1.数值类型2.字符串类型3.日期和时间类型4.enum和set 2.MySQL运算符1.算数运算符2.逻辑运算符3.比较运算符 3.MySQL完…...
【高级IO】多路转接之单线程Reactor
这里写目录标题 一.Epoll的两种工作模式二.单线程Reactor1.Connection模块2.Reactor服务器模块2.1初始化Init2.2启动循环服务器Loop2.3事件派发Dispatcher2.4连接管理器Accepter2.5事件管理器Receiver2.6发送管理器Sender 3.上层业务模块定制协议业务处理 代码 一.Epoll的两种工…...
基于设备指纹识别的反爬虫技术:给设备办 “身份证”
传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。 一、基础参数采集:构建设备指纹的…...
公开模型一切,优于DeepSeek-R1,英伟达开源Llama-Nemotron家族
在大模型飞速发展的今天,推理能力作为衡量模型智能的关键指标,更是各家 AI 企业竞相追逐的焦点。 但近年来,推理效率已成为模型部署和性能的关键限制因素。 基于此,英伟达推出了 Llama-Nemotron 系列模型(基于 Meta …...
CI/CD面试题及答案
一、CI/CD 基础概念 1. 什么是 CI/CD?CI 和 CD 的区别是什么? 答案: CI(持续集成):开发人员提交代码后,自动构建并运行测试,确保代码集成无冲突。CD(持续交付 / 部署&am…...
解决 Ubuntu DNS 无法解析问题(适用于虚拟机 长期使用)
解决 Ubuntu DNS 无法解析问题 在使用 Ubuntu 虚拟机(尤其是在国内)时,经常会遇到这样的错误: Temporary failure resolving cn.archive.ubuntu.com但是此时又能成功 ping 通 IP,这说明网络是正常的,问题…...
如何通过C# 获取Excel单元格的数据类型
在处理 Excel 文件时,了解单元格的数据类型有助于我们正确地解析和处理数据。Free Spire.XLS 是一款功能强大且免费的.NET 组件,支持高效地操作 Excel 文件,包括读取单元格类型。本文将详细介绍如何使用 Free Spire.XLS 来获取 Excel 单元格的…...
Spring Boot初级教程:从零搭建企业级Java应用
一、Spring Boot是什么?为什么学它? 定义:Spring Boot是Spring框架的轻量级快速开发工具,基于“约定优于配置”原则,简化Spring应用的搭建与部署。核心优势: 零配置起步:内置Tomcat/Jetty,无需手动部署Web服务器。自动装配:自动扫描依赖、注入Bean,减少XML/注解冗余代…...
IBM BAW(原BPM升级版)使用教程第六讲
一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一个非常独特和强大的概念,旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程自动化,它…...
[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整
目录 X-CMD 发布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac✅ 升级指南 X-CMD 发布 v0.5.11 beta 📃Changelog 🧩 ping 调整 x ping 默认参数为 bing.com&a…...
Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)
Web前端—VSCode如何解决打开html页面中文乱码的问题(方法2) 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或在搜索框直接搜索“files.autoGuessEnc…...
打造专属AI好友:小智AI聊天机器人详解
打造专属AI好友:小智AI聊天机器人详解 在当下的科技热潮中,AI正迅速改变着我们的生活,成为了科技领域的新宠。而今,借助开源项目的力量,你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…...
Spring,SpringMVC,SpringBoot,SpringCloud的区别
Spring Spring 是一个基础框架,为 Java 应用提供了 IoC(控制反转)和 AOP(面向切面编程)功能。其主要特点如下: IoC 容器:借助依赖注入,降低了组件间的耦合度。AOP 支持:…...
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
对于选择python作为测试脚本开发的同学来说,pytest和python unittest是必需了解的两个框架。那么他们有什么区别?我们该怎么选?让我们一起来了解一下吧! 我们从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架…...
无人机电池储存与操作指南
一、正确储存方式 1. 储存电量 保持电池在 40%-60% 电量(单片电压约3.8V-3.85V)存放,避免满电或空电长期储存。 满电存放会加速电解液分解,导致鼓包;**空电**存放可能引发过放(电压低于3.0V/片会永久…...
CSS实现图片垂直居中方法
html <div class"footer border-top-row"><div class"footer-row"><span class"footer-row-col01">制单人:{{ printData[pageIndex - 1].rkMaster.makerName}}<img :src"getPersonSignImgSrc(printData[pa…...
多账号管理与自动化中的浏览器指纹对抗方案
多账号管理与自动化中的浏览器指纹对抗方案 在日常的开发工作中,如果你曾涉及自动化脚本、多账号运营、数据抓取,或是在安全研究方向摸爬滚打过,应该对“浏览器指纹识别”这几个字不会陌生。 指纹识别:不是你以为的那种“指纹”…...
[6-1] TIM定时中断 江协科技学习笔记(45个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 TRGO是“Trigger Output”的缩写,中文意思是“触发输出”。在STM32微控制器中,TRGO是一个非常重要的功能,它允许定时器(Timer)在特定事件发生时输出一个触发信号。这个触发信号可以用…...
Flutter 3.29.3 花屏问题记录
文章目录 Flutter 3.29.3 花屏问题记录问题记录解决尝试解决 Flutter 3.29.3 花屏问题记录 问题记录 flutter版本3.29.3,代码大致为: ShaderMask(shaderCallback: (Rect bounds) {return LinearGradient(begin: Alignment.topCenter,end: Alignment.bo…...
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools(1.4.0.7)
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools 链接:https://pan.xunlei.com/s/VOPpN9A3Tn_rVktEMu6Lg9q9A1?pwdh8rz# 希望能修复好硬盘...