JVM——即时编译器的中间表达形式
中间表达形式(IR):编译器的核心抽象层
1. IR的本质与作用
在编译原理的体系中,中间表达形式(Intermediate Representation, IR)是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR,而后端则针对IR进行优化并生成目标代码。对于Java虚拟机的即时编译器(JIT)而言,其输入并非Java源代码,而是已经过静态编译的字节码。尽管字节码已剥离了高级语法糖并采用栈式计算模型,但直接将其作为优化基础仍存在局限——现代编译器依赖更适合优化的IR结构,其中最典型的便是静态单赋值(SSA)形式。
SSA IR的核心特性
静态单赋值:每个变量仅能被赋值一次,赋值后的变量不可修改。例如,传统代码中的y = 1; y = 2;
在SSA中变为y1 = 1; y2 = 2;
,确保每个值都有唯一的定义点。
数据流清晰化:通过唯一赋值的特性,编译器可轻松识别冗余赋值、死代码等问题。例如,未被使用的y1
可直接删除,无需复杂的数据流分析。
优化友好性:SSA为常量折叠、强度削减等优化提供了理想的基础。例如,x = 4 * 1024
可在编译期直接计算为x = 4096
,消除运行时计算开销。
2. SSA中的Phi函数:处理控制流分支的关键
当程序存在条件分支时,不同路径对同一变量的赋值会导致后续使用时的歧义。SSA通过引入Phi函数(Φ函数)解决这一问题,该函数根据控制流的走向选择不同的变量版本。例如:
if (x > 0) {y = 0;
} else {y = 1;
}
x = y;
在SSA中转换为:
x1 = ...;
if (x1 > 0) {y1 = 0;
} else {y2 = 1;
}
y3 = Phi(y1, y2); // 根据分支选择y1或y2的值
x2 = y3;
Phi函数的引入确保了每个基本块出口处的变量值具有明确的定义,为后续的数据流分析和优化提供了统一的模型。
3. 从字节码到SSA IR的转换
Java字节码的栈式结构(如iload
、istore
指令)需要转换为基于寄存器的SSA形式。即时编译器首先构建控制流图(CFG),将每个字节码指令映射为IR节点,然后通过SSA转换算法(如GCC的ssa_opt
pass)为每个变量生成唯一的版本,并在控制流交汇点插入Phi函数。这一过程并非简单的语法转换,而是结合语义分析消除歧义,例如处理异常跳转、同步块等复杂逻辑。
Sea-of-Nodes:HotSpot与Graal的IR革命
1. Sea-of-Nodes的设计哲学
HotSpot的C2编译器和GraalVM的Graal编译器采用了一种激进的SSA变体——Sea-of-Nodes IR。其核心思想是摒弃变量概念,直接以“值节点”为中心,每个节点代表一个计算结果或数据值,节点之间通过依赖关系连接,形成数据流图。
与传统SSA的区别
无变量名依赖:传统SSA仍保留变量名(如x1
、y2
),而Sea-of-Nodes中每个值由节点直接表示。例如,Phi(y1, y2)
变为Phi(0, 1)
,其中0和1是具体的常量节点。
节点即值:每个计算(如加法、条件判断)都是一个节点,输入输出均为节点引用。这种设计使常量传播成为“无操作”——常量值直接作为节点存在,无需额外处理。
2. IR图的结构解析
以foo(int count)
方法为例,其IR图包含以下关键元素:
-
固定节点:表示控制流的关键位置,如
Start
(方法入口)、End
(方法出口)、LoopBegin
(循环起点)、If
(条件判断)。 -
浮动节点:表示具体的计算或数据值,如
Phi
节点(处理分支值合并)、+
节点(加法运算)、P(n)
节点(方法参数)。 -
控制流边:红色线条连接基本块,表示程序执行路径(如循环回边、条件跳转)。
-
数据流边:蓝色线条表示数据依赖,如
+
节点依赖其操作数节点的值。
基本块与控制流关系
基本块是具有单一入口和出口的连续IR节点序列,其划分原则是:仅在分支指令(如if
、goto
)处终止。例如:
-
B0
:包含方法入口和初始赋值(如sum = 0
)。 -
B1
:循环体的入口,包含循环条件判断(i < count
)。 -
B2
:循环体内部,执行sum += i
并更新循环变量i
。 -
B3
:循环结束后的处理,如返回结果。
控制流关系通过基本块之间的跳转边表示。例如,B2
执行完毕后,根据循环条件可能跳转回B1
(继续循环)或进入B3
(退出循环)。
3. 节点调度与依赖处理
在Sea-of-Nodes中,浮动节点的位置并非固定,需要通过节点调度算法确定其在基本块中的排列顺序,确保数据依赖和控制依赖得到满足:
数据依赖:节点A的输入依赖节点B的输出,A必须在B之后调度(如+
节点依赖其操作数节点)。
控制依赖:条件判断节点(如If
)的后续节点必须在其之后调度。
内存依赖:C2编译器显式记录内存读写的顺序依赖,而Graal通过固定节点(如内存访问操作)的顺序隐式处理,简化了调度逻辑。
Global Value Numbering(GVN):基于值的等价计算消除
1. GVN的核心思想
GVN是一种全局范围的公共子表达式消除(CSE)技术,其目标是识别并合并计算结果相同的节点,避免冗余计算。在Sea-of-Nodes中,每个节点代表一个唯一的值,GVN通过比较节点的类型和输入参数,判断是否为等价计算。
与传统CSE的区别
-
值比较而非语法比较:CSE依赖词法分析判断表达式是否相同(如
a * b
和b * a
可能被视为不同),而GVN通过语义等价性判断(结合交换律等数学性质),能识别更多等价情况。 -
全局作用域:GVN在整个IR图中搜索等价节点,而非局限于单个基本块,因此能消除跨块的冗余计算。
2. GVN的实现步骤
以代码sum = a * b; if (a > 0) sum += a * b; if (b > 0) sum += a * b;
为例:
-
构建IR图:三次
a * b
运算生成三个*
节点(假设a
和b
的值未变化)。 -
节点匹配:GVN算法检测到这三个
*
节点的输入参数(a
和b
节点)完全相同,且无内存副作用(如修改全局变量)。 -
节点合并:将三个节点合并为一个,后续引用直接指向该节点,消除重复计算。
3. 副作用处理与优化边界
GVN仅适用于无副作用的操作(如纯数学运算),对于涉及内存访问、I/O操作的节点(如array[i] = x
),由于其结果可能依赖上下文,无法进行合并。即时编译器通过标记节点的副作用属性(如hasSideEffect
标志)来避免错误合并,确保程序语义的正确性。
IR图的可视化与实践:以IGV工具为例
1. Ideal Graph Visualizer(IGV)简介
IGV是HotSpot C2和Graal编译器的官方IR可视化工具,支持实时查看编译过程中生成的IR图,帮助开发者理解优化细节。其主要功能包括:
-
节点层级展示:显示每个IR节点的类型、输入输出及依赖关系。
-
基本块划分:用不同颜色标注基本块,清晰呈现控制流结构。
-
优化过程追踪:观察GVN、循环展开等优化前后的IR变化。
2. 使用IGV的实践步骤
环境准备
JDK版本:Java 10+(需启用Graal编译器)。
工具下载:从OpenJDK官方仓库获取IGV,解压后运行bin/idealgraphvisualizer
。
代码示例
以hash(Object input)
方法为例,编译时添加参数生成IR输出:
java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
-XX:CompileCommand='print,CompilationTest.hash' CompilationTest
可视化分析
-
节点搜索:通过方法名定位
hash
方法的IR图,查看instanceof
节点如何转换为类型检查节点。 -
Phi节点观察:在条件分支交汇处,查看
Phi
节点如何合并不同路径的返回值。 -
GVN效果验证:对比优化前后的IR图,确认重复的
hashCode()
调用是否被合并。
3. 常见IR节点解析
P(n)节点:表示方法的第n个参数,如P(0)
为第一个参数input
。
Iconst节点:表示常量值,如Iconst_0
代表整数0。
Invoke节点:表示方法调用,如invokevirtual Object.hashCode()
对应Invoke
节点,输入为对象实例节点。
Sea-of-Nodes IR的优势与挑战
1. 优化能力的提升
激进优化支持:无变量名的设计使编译器能更自由地重排节点顺序,例如将循环不变量提升到循环外。
跨语言统一:GraalVM的Sea-of-Nodes IR支持多种语言(如Java、JavaScript、Rust)的编译,通过统一的节点模型实现跨语言优化。
2. 实现复杂度与性能平衡
节点爆炸问题:细粒度的节点划分可能导致IR图规模膨胀,增加内存占用和调度开销。C2通过节点合并策略(如常量折叠自动合并)缓解这一问题。
调试难度:IR节点与源代码的映射关系复杂,需借助-XX:PrintAssembly
等工具结合反汇编结果定位问题。
3. 与硬件架构的协同
Sea-of-Nodes的数据流模型与现代CPU的超标量架构高度契合:
-
指令级并行:调度算法可将无依赖的节点分配到不同CPU核心并行执行。
-
寄存器分配:每个值节点天然适合寄存器分配,避免传统变量分配中的寄存器溢出问题。
总结
即时编译器的中间表达形式是连接高级语言与机器码的魔法桥梁。从SSA的严谨定义到Sea-of-Nodes的激进创新,从GVN的等价消除到IGV的可视化实践,每一项技术都凝聚着编译原理的智慧。掌握这些知识,不仅能让我们写出更易被JIT优化的代码,更能深入理解现代虚拟机的核心竞争力——这正是我们拆解Java虚拟机的终极目标。
1. IR设计的核心原则
抽象层分离:IR作为中间表示,隔离了前端的语法差异与后端的硬件特性,使编译器优化具有通用性。
优化导向:SSA和Sea-of-Nodes的设计目标是让编译器能高效实施各种优化,而非仅仅正确翻译代码。
2. 从理论到实践的桥梁
IR技术并非空中楼阁,而是实际应用于HotSpot、GraalVM等工业级JVM的核心技术。通过IGV工具,开发者可直观观察到这些技术如何将简单的Java代码转换为复杂的优化后机器码,理解“代码即数据”的编译哲学。
3. 未来发展方向
动态IR优化:结合运行时Profiling数据,动态调整IR节点的优化策略,如根据分支频率重排节点顺序。
AI驱动的IR分析:利用机器学习模型预测最优节点调度方案,进一步提升代码生成效率。
异构架构适配:针对GPU、NPU等异构设备,扩展Sea-of-Nodes模型以支持数据并行和任务并行的优化。
相关文章:
JVM——即时编译器的中间表达形式
中间表达形式(IR):编译器的核心抽象层 1. IR的本质与作用 在编译原理的体系中,中间表达形式(Intermediate Representation, IR)是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR,而后…...
Js 判断浏览器cookie 是否启用
验证时 google浏览器 135.0.7049.117 不生效 cookie.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>Cookie 检测</title> </head> <body><h1>检测是否启用 Cookie<…...
数字相机的快门结构
数字相机(DC/DSLR等)的快门结构和传统相机有所不同,除了机械快门以外,还存在电子快门,实际上是二者的混合体。我写这篇文章大概介绍一下数字相机的快门结构,希望能抛砖引玉。 要讨论数字相机的快门结构,首先先要了解一下数字相机的结构分类,根据成像原理不同,数字相机大…...
LeetCode --- 448 周赛
题目列表 3536. 两个数字的最大乘积 3537. 填充特殊网格 3538. 合并得到最小旅行时间 3539. 魔法序列的数组乘积之和 一、两个数字的最大乘积 由于数据都是正数,所以乘积最大的两个数,本质就是找数组中最大的两个数即可,可以排序后直接找到…...
添加物体.
在cesium中我们可以添加物体进入地图.我们以广州塔为例 //生成广州塔的位置var position2 Cesium.Cartesian3.fromDegrees(113.3191,23.109,100)viewer.camera.setView({//指定相机位置destination: position2, 运行后如图 我们使用cesium官网提供的代码为广州塔在地图上标点…...
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例 在现代工业自动化系统中,设备之间的互联互通至关重要。Profibus DP和Modbus TCP是两种常见的通信协议,分别应用于不同的场景。为了实现这两种协议的相互转换,Profibus …...
Yocto中`${S}`和`${WORKDIR}`的联系与区别
在Yocto项目中,${S}和${WORKDIR}是构建过程中两个核心路径变量,它们的关系及用途如下: 定义与层级关系${WORKDIR}(工作目录) 是Recipe所有任务执行的基础目录,路径结构为: build/tmp/work/<arch>/<recipe-name>/<version>/。 该目录包含源码解压后的所…...
CDGP历次主观题真题回忆
(一)【论述】 1如何设计企业的数据安全体系?活动+方法+DSMM 2如何管理公司混乱的数据质量?活动+遵循原则+建立质量维度+质量改进生命周期+高阶指标。...
Java学习手册:Spring Cloud 组件详解
一、服务发现组件 - Eureka 核心概念 :Eureka 是一个服务发现组件,包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册中心,负责维护服务实例的注册信息;Eureka Client 则是集成在应用中的客户端࿰…...
【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通
使用 LLaMA-Factory 进行模型微调:从入门到精通 一、环境搭建:奠定微调基础(一)安装依赖工具(二)创建 conda 环境(三)克隆仓库并安装依赖 二、数据准备:微调的基石&#…...
sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离
前言 sensitive-word-admin 最初的定位是让大家知道如何使用 sensitive-word,所以开始想做个简单的例子。 不过秉持着把一个工具做好的原则,也收到很多小伙伴的建议。 v2.0.0 在 ruoyi-vue(也非常感谢若依作者多年来的无私奉献)…...
HTML属性
HTML(HyperText Markup Language)是网页开发的基石,而属性(Attribute)则是HTML元素的重要组成部分。它们为标签提供附加信息,控制元素的行为、样式或功能。本文将从基础到进阶,全面解析HTML属性…...
计算机网络 4-1 网络层(网络层的功能)
【考纲内容】 (一)网络层的功能 异构网络互连;路由与转发;SDN基本概念;拥塞控制 (二)路由算法 静态路由与动态路由;距离-向量路由算法;链路状态路由算法;层…...
《算法导论(第4版)》阅读笔记:p17-p27
《算法导论(第4版)》学习第 10 天,p17-p27 总结,总计 11 页。 一、技术总结 1. insertion sort (1)keys The numbers to be sorted are also known as the keys(要排序的数称为key)。 第 n 次看插入排序,这次有两个地方感触比较深&#…...
C++中线程安全的对多个锁同时加锁
C中线程安全的对多个锁同时加锁 C中线程安全的对两个锁同时加锁 C中线程安全的对两个锁同时加锁 参考文档:https://llfc.club/articlepage?id2UVOC0CihIdfguQFmv220vs5hAG 如果我们现在有一个需要互斥访问的变量 big_object,它的定义如下: …...
子串简写(JAVA)一维前缀和, 蓝桥杯
这个题用前缀和,开两个数组,一个存前n个字符数据的c1的数字个数,另一个前n个字符c2的数字个数,然后遍历一次加起来,有一个测试点没过去,把那个存最后数的换成long,应该是这题数据范围给的不对&a…...
数据库故障排查全攻略:从实战案例到体系化解决方案
一、引言:数据库故障为何是技术人必须攻克的 "心腹大患" 在数字化时代,数据库作为企业核心数据资产的载体,其稳定性直接决定业务连续性。据 Gartner 统计,企业每小时数据库 downtime 平均损失高达 56 万美元࿰…...
vllm笔记
目录 vllm简介vllm解决了哪些问题?1. **瓶颈:KV 缓存内存管理低效**2. **瓶颈:并行采样和束搜索中的内存冗余**3. **瓶颈:批处理请求中的内存碎片化** 快速开始安装vllm开始使用离线推理启动 vLLM 服务器 支持的模型文本语言模型生…...
“AI+城市治理”智能化解决方案
目录 一、建设背景 二、需求分析 三、系统设计 四、系统功能 五、应用场景 六、方案优势 七、客户价值 八、典型案例 一、建设背景 当前我国城市化率已突破65%,传统治理模式面临前所未有的挑战。一方面,城市规模扩大带来治理复杂度呈指数级增长,全国城市管理案件年…...
《医疗AI的透明革命:破解黑箱困境与算法偏见的治理之路》
医疗AI透明度困境 黑箱问题对医生和患者信任的影响:在医疗领域,AI模型往往表现为难以理解的“黑箱”,这会直接影响医生和患者对其诊断建议的信任度 。医生如果无法理解AI给出诊断的依据,就难以判断模型是否存在偏见或错误&#x…...
【论文阅读】Efficient and secure federated learning against backdoor attacks
Efficient and secure federated learning against backdoor attacks -- 高效且安全的可抵御后门攻击的联邦学习 论文来源问题背景TLDR系统及威胁模型实体威胁模型 方法展开服务器初始化本地更新本地压缩高斯噪声与自适应扰动聚合与解压缩总体算法 总结优点缺点 论文来源 名称…...
21、DeepSeekMath论文笔记(GRPO)
DeepSeekMath论文笔记 0、研究背景与目标1、GRPO结构GRPO结构PPO知识点**1. PPO的网络模型结构****2. GAE(广义优势估计)原理****1. 优势函数的定义**2.GAE(广义优势估计) 2、关键技术与方法3、核心实验结果4、结论与未来方向关键…...
深入解析:如何基于开源p-net快速开发Profinet从站服务
一、Profinet协议与软协议栈技术解析 1.1 工业通信的"高速公路" Profinet作为工业以太网协议三巨头之一,采用IEEE 802.3标准实现实时通信,具有: 实时分级:支持RT(实时)和IRT(等时实时)通信模式拓扑灵活:支持星型、树型、环型等多种网络结构对象模型:基于…...
腾讯多模态定制化视频生成框架:HunyuanCustom
HunyuanCustom 速读 一、引言 HunyuanCustom 是由腾讯团队提出的一款多模态定制化视频生成框架。该框架旨在解决现有视频生成方法在身份一致性(identity consistency)和输入模态有限性方面的不足。通过支持图像、音频、视频和文本等多种条件输入,HunyuanCustom 能…...
警惕C#版本差异多线程中的foreach陷阱
警惕C#版本差异多线程中的foreach陷阱 同样的代码,不同的结果闭包捕获的“时间差”问题绕过闭包陷阱的三种方法Lambda立即捕获(代码简洁)显式传递参数(兼容性最佳)使用Parallel.ForEach(官方推荐)注意事项:版本兼容性指南警惕多线程中的foreach陷阱:C#版本差异引发的…...
2024年AI发展趋势全面解析:从多模态到AGI的突破
2024年AI发展五大核心趋势 1. 多模态AI的爆发式增长 GPT-4V、Gemini等模型实现文本/图像/视频的跨模态理解应用场景扩展至智能客服、内容创作、工业质检等领域 2. 小型化与边缘AI的崛起 手机端LLM(如Phi-2)实现本地化部署隐私保护与实时响应的双重优…...
高精度之加减乘除之多解总结(加与减篇)
开篇总述:精度计算的教学比较杂乱,无系统的学习,且存在同法多线的方式进行同一种运算,所以我写此篇的目的只是为了直指本质,不走教科书方式,步骤冗杂。 一,加法 我在此讲两种方法: …...
Arduino 开源按键库大合集(单击/双击/长按实现)
2025.5.10 22:25更新:增加了Button2 2025.5.10 13:13更新:增加了superButton 虽然Arduino自带按键中断attachInterrupt(button1.PIN, isr, FALLING);,但是要是要实现去抖,双击检测,长按检测等等就略微麻烦些࿰…...
相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…...
Java零组件实现配置热更新
在某些场景下,我们需要实现配置的热更新,但是又要实现软件即插即用的需求,这就使我们不能引入过多复杂的插件,而nacos等配置中心在分布式业务场景下对配置的管理起着很重要作用,为此需要想一些办法去代替它们而完成同样…...
Kotlin高阶函数多态场景条件判断与子逻辑
Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…...
Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉
Ethercat转Profinet网关如何用"协议翻译术"打通自动化产线任督二脉 将遗留的Profinet设备(如传感器)接入现代EtherCAT主站(如Codesys控制器)避免全面更换硬件。 作为一名电气工程师,我最近面临的一个挑战&a…...
每日算法刷题Day1 5.9:leetcode数组3道题,用时1h
1.LC寻找数组的中心索引(简单) 数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 思想: 计算总和和左侧和,要让左侧和等于右侧和,即左侧和总和-左侧和-当前数字 代码 c代码: class Solution { public:i…...
MySQL的视图
一、MySQL视图的介绍和作用 MySQL视图,加油兄弟们,孰能生巧,完整代码在最后!!! 视图是一个虚拟的表,并不是真是存在的,视图其实并没有真实的数据,他只是根据一个sql语句…...
旅游推荐数据分析可视化系统算法
旅游推荐数据分析可视化系统算法 本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法,包括推荐算法、数据分析算法和可视化算法。 目录 推荐算法 基于用户的协同过滤推荐基于浏览历史的推荐主题推荐算法 亲子游推荐算法文化游推荐算法自然风光推荐算法…...
Pandas:数据处理与分析
目录 一、Pandas 简介 二、Pandas 的安装与导入 三、Pandas 的核心数据结构 (一)Series (二)DataFrame 四、Pandas 数据读取与写入 (一)读取数据 (二)写入数据 五、数据清洗…...
非阻塞式IO-Java NIO
一、NIO简介 Java NIO是Java1.4引入的一种新的IO API,它提供了非阻塞式IO,选择器、通道、缓冲区等新的概念和机制。相比传统的IO,多出的N不单纯是新的,更表现在Non-blocking非阻塞,NIO具有更高的并发性、可扩展性以及…...
tryhackme——Enumerating Active Directory
文章目录 一、凭据注入1.1 RUNAS1.2 SYSVOL1.3 IP和主机名 二、通过Microsoft Management Console枚举AD三、通过命令行net命令枚举四、通过powershell枚举 一、凭据注入 1.1 RUNAS 当获得AD凭证<用户名>:<密码>但无法登录域内机器时,runas.exe可帮助…...
(二)Linux下基本指令 2
【知识预告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ‒r 指令 27. 重要的⼏个热键 28. 关机 16 date 指令 指定格式显⽰时间:date %Y-…...
[ctfshow web入门] web70
信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");读取的index.php error_reporting和ini_set被禁用了,不必管他 error_reporting(0); ini_set(display_errors, 0); // 你们在炫技吗? if(isset($_POST[c])){…...
第三章 Freertos智能小车遥控控制
本文基于小车APP,通过与蓝牙模块进行连接,发送特定信号给小车主控,实现对小车的模式切换、灯光控制、前进、后退、左右控制。目前还未加入电机控制,具体的电机控制效果还不能实现,但是可以进行模式切换与灯光控制。 …...
Spring 6.x 详解介绍
Spring 6.x 是 Spring Framework 的最新主版本,于2022年11月正式发布,标志着对 Java 17 和 Jakarta EE 9 的全面支持,同时引入了多项革新性特性,旨在优化性能、简化开发并拥抱现代技术趋势。 一、核心特性与架构调整 Java 17 与 J…...
阿里云OSS+CDN自动添加文章图片水印配置指南
文章目录 一、环境准备二、OSS水印样式配置三、CDN关键配置四、Handsome主题自动化配置五、水印效果验证六、常见问题排查 一、环境准备 资源清单 阿里云OSS Bucket(绑定自定义域名 static.example.com)阿里云CDN加速域名,回源为Bucket的域名…...
hot100-子串-JS
一、560.和为k的子串 560. 和为 K 的子数组 提示 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2…...
LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在日常开发中,我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该…...
《操作系统真象还原》第十三章——编写硬盘驱动程序
文章目录 前言硬盘及分区表创建从盘及获取安装的磁盘数创建磁盘分区表硬盘分区表浅析 编写硬盘驱动程序硬盘初始化修改interrupt.c编写ide.h编写ide.c 实现thread_yield和idle线程修改thread.c 实现简单的休眠函数修改timer.c 完善硬盘驱动程序继续编写ide.c 获取硬盘信息&…...
DNS服务实验
该文章将介绍DNS服务的正向和反向解析实验、主从实验、转发服务器实验以及Web解析实验 正向解析实验:将域名解析为对应的IP地址 反向解析实验:将IP地址解析为对应的域名 主从实验:主服务器区域数据文件发送给从服务器,从服务器…...
SierraNet M1288网络损伤功能显著助力GPU互联网络的测试验证,包含包喷洒,LLR等复杂特性的验证测试
SierraNet M1288 以太网协议分析仪 产品概述 SierraNet M1288 是一款兼具高性价比与全面功能的以太网和光纤通道数据捕获及协议验证系统。它能够以全线路速率 100% 记录所有流量,并借助 InFusion™ 工具实现高级错误注入和流量破坏功能,为开发人员和协议…...
HunyuanCustom:文生视频框架论文速读
《HunyuanCustom: A Multimodal-Driven Architecture for Customized Video Generation》论文讲解 一、引言 本文提出了 HunyuanCustom,这是一个基于多模态驱动的定制化视频生成框架。该框架旨在解决现有视频生成模型在身份一致性(identity consistenc…...
HTTP、HTTPS、SSH区别以及如何使用ssh-keygen生成密钥对
HTTP、HTTPS、SSH区别以及如何使用ssh-keygen生成密钥对 HTTP (HyperText Transfer Protocol) 定义:应用层协议,用于通过Web传输数据(如网页、文件)默认端口:80机制:客户端发送Get请求,服务器…...