《Java 100 天进阶之路》第66篇:JIT编译与性能优化(2026版)

【信息科学与工程学】计算机科学与自动化——第一百五十九篇 并行计算开发设计01 编号编程语言(含版本)+开发框架应用场景机制+用法+详细设计+详细配置编译器(版本+内核+底层机制+优化方法+阶段)底层实现·说明·缺陷+优势的·解决方案及数学建模引入版本国产化/信创/商用CPU/GPU/DPU芯片适配及指令集列表和指令调用和时序图关联知识&标准1高性能科学计算、深度学习训练与推理、图像处理、物理模拟、金融风险分析SIMT模型,kernel函数并行执行海量线程。用法:定义__global__ 阅读详情

第66篇:JIT编译与性能优化(2026版)

📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第65篇:OOM与内存泄漏排查 |
➡️ 下一篇:第67篇:JVM面试压轴题

🗺️ 本文阅读地图(3 分钟速览)

第61~65篇搞定了JVM内存、GC、类加载器、OOM排查,但你是否想过——为什么Java程序越跑越快? 答案就是JIT即时编译器。本篇直击JIT编译与性能优化:

模块核心问题一句话回答
JIT是什么Java为什么能越跑越快?运行时将热点字节码编译为本地机器码并缓存,后续直接执行
双重执行模型解释器和JIT怎么配合?解释执行保启动,JIT编译提峰值
C1 vs C2两个编译器有什么区别?C1快(保启动),C2深(追峰值)
分层编译5个层级怎么流转?0层解释 → 3层C1采集profile → 4层C2极致优化
核心优化JIT做了什么让代码变快?方法内联、逃逸分析、锁消除、标量替换、栈上分配
调优工具怎么观察JIT在干嘛?-XX:+PrintCompilation 看编译日志
面试最爱问高频考点有哪些?见文末 🎤 小节

一、核心知识点

1. 为什么Java“越跑越快”?

很多Java开发者都有这样的体验:应用刚启动时响应慢,运行几分钟后速度明显提升。这不是错觉,而是JIT即时编译器在“后台发力”。

Java是典型的半编译半解释型语言:

阶段工具产出特点
编译期javac.class字节码几乎不做性能优化
运行期解释器 + JIT机器码先解释执行,后JIT优化

JIT的核心设计目标是:识别运行期的热点代码,将其直接编译为本地机器码并缓存,同时基于运行时数据做极致的编译优化,让热点代码的执行性能无限接近原生语言。

2. JIT的两大核心编译器

HotSpot JVM包含两个不同定位的JIT编译器:

编译器定位编译速度优化深度适用场景
C1(Client Compiler)快速编译快浅启动阶段,降低延迟
C2(Server Compiler)深度优化慢深稳定运行后,追求峰值性能

3. 分层编译的5个层级

JDK 8默认开启分层编译(Tiered Compilation),将代码执行分为5个层级:

层级编译器说明
0层解释器纯解释执行,不采集任何数据
1层C1无profileC1快速编译,不采集性能数据
2层C1有限profile仅采集调用次数等基础数据
3层C1全量profile采集完整运行时数据,为C2提供支撑
4层C2极致优化基于3层profile做全局激进优化

核心流转逻辑:代码初始以0层解释执行,当方法调用次数+循环回边次数达到阈值(默认10000次),进入3层C1编译采集profile数据;继续达到C2阈值后,进入4层C2极致编译。

4. JIT核心优化手段

JIT在编译机器码前会进行多种优化:

优化技术作用效果
方法内联小方法体直接插入调用处减少方法调用开销
逃逸分析分析对象是否逃逸出方法/线程决定能否栈上分配
栈上分配不逃逸的对象分配在栈上减轻GC压力
标量替换对象拆散为基本类型变量减少堆分配
锁消除无竞争锁直接移除减少同步开销
公共子表达式消除重复计算只算一次减少CPU开销

二、通俗讲解(1分钟开心学)

把Java程序想象成一场“现场音乐会”

  • 解释器:乐手拿到乐谱(字节码)后,看一个音符吹一个音符。启动快,但遇到复杂的曲子(重复执行的热点代码),每次都现看现吹,效率低。

  • JIT编译器:乐手发现有一段旋律反复出现(热点代码),干脆把这段旋律背下来(编译成机器码)。下次再遇到,直接演奏(执行机器码),又快又准。

  • 分层编译:先是现场读谱(0层解释),然后快速记个大概(C1编译),再反复打磨细节(C2深度优化),最终成为“肌肉记忆”(4层机器码)。

  • 预热过程:应用刚启动时,JIT还没完成编译,性能一般。随着运行时间增加,热点代码被识别并优化,性能逐渐提升到峰值。这就像运动员热身——越跑越快。

一句话总结JIT:> JIT让Java程序“越跑越快”——把反复执行的代码背下来,下次直接执行。

三、核心优化技术详解

3.1 方法内联:消灭方法调用开销

方法调用本身有栈帧创建、参数传递、返回等开销。JIT会把小方法体直接“塞”到调用位置。

示例:

// 源码
int add(int a, int b) { return a + b; }
int result = add(10, 20);

// JIT内联后(等价于)
int result = 10 + 20;

内联阈值参数:

  • -XX:MaxInlineSize=35:最大内联方法体大小(字节码字节数)
  • -XX:FreqInlineSize=325:热点方法内联大小阈值
  • -XX:+PrintInlining:打印内联决策日志

💡 效果:方法内联在JMH基准测试中可带来10-20倍的性能提升。

3.2 逃逸分析与栈上分配:把对象从堆搬到栈

逃逸分析:JIT分析对象的作用域,判断它是否“逃逸”出方法或线程:

逃逸类型含义优化可能
不逃逸对象只在方法内部使用✅ 栈上分配、标量替换
方法逃逸对象作为参数传给其他方法⚠️ 部分优化
线程逃逸对象赋值给类变量,多线程共享❌ 无法优化

栈上分配:不逃逸的对象直接在栈上分配,方法结束自动销毁,无需GC介入。

public void method() {
    // 局部对象,不逃逸 → 栈上分配,不触发GC
    StringBuilder sb = new StringBuilder();
    sb.append("hello");
    System.out.println(sb.toString());
}

💡 效果:逃逸分析优化在JMH测试中可达50倍的性能提升。

3.3 锁消除:移除无用的同步

如果JIT发现锁对象只在单线程中使用,会直接把synchronized移除。

public synchronized void method() {
    // 如果该方法只在单线程中调用
    // JIT会移除synchronized,消除锁开销
}

💡 原理:StringBuffer的方法都是synchronized,但在局部变量中单线程使用时,JIT会自动消除锁。

3.4 标量替换:对象拆散为“零件”

把对象拆散成多个独立的成员变量,直接在栈上或寄存器中使用,不分配堆内存。

// 源码
Point p = new Point(10, 20);
int x = p.x + p.y;

// 标量替换后(等价于)
int x = 10 + 20;
3.5 栈上替换(OSR):循环中的“中途上车”

OSR(On-Stack Replacement)允许JIT在循环执行过程中把解释执行的代码替换为编译后的机器码。

💡 场景:一个while(true)循环正在执行,JIT在循环中途完成编译,立即切换到机器码执行,无需等待循环结束。

四、JIT调优与监控

4.1 查看JIT编译日志
# 基础编译日志
-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation
# 输出格式:编译序号 编译层级 方法名 大小 耗时
# 示例:  123    4       com.example.Service::process (10 bytes)

PrintCompilation输出各列含义:

  • 编译序号:JVM启动以来的编译顺序
  • 编译层级:0-4层(4=C2极致优化)
  • 方法名:被编译的类和方法
  • 大小:字节码大小(bytes)
  • 耗时:编译耗时(ms)
4.2 查看方法内联决策
-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -XX:+PrintInlining

输出示例:

@ 2   com.example.Service::add (5 bytes)   inline (hot)
@ 5   com.example.Service::validate (20 bytes)   too big
  • inline (hot):方法被内联
  • too big:方法体太大,超过内联阈值
4.3 查看代码缓存使用情况
# 查看代码缓存大小和使用率
jcmd <pid> Compiler.codecache_stats

💡 注意:代码缓存(CodeCache)存放编译后的机器码。如果CodeCache太小,可能导致JIT编译被禁用,性能下降。

4.4 常用JIT调优参数
参数作用默认值
-XX:+TieredCompilation开启分层编译JDK 8+默认开启
-XX:CompileThresholdC2编译触发阈值10000(Server模式)
-XX:MaxInlineSize最大内联方法体大小35 bytes
-XX:FreqInlineSize热点方法内联大小阈值325 bytes
-XX:ReservedCodeCacheSize代码缓存最大大小240MB
-XX:+PrintCompilation打印编译日志关闭
-XX:+PrintInlining打印内联决策关闭
4.5 性能分析工具
工具用途启动方式
JITWatch可视化JIT编译过程需加载编译日志
Java Flight Recorder (JFR)分析热点代码-XX:StartFlightRecording
VisualVM实时监控方法调用-Dcom.sun.management.jmxremote

五、生产级最佳实践

5.1 让JIT发挥最大威力的4个建议
  1. 给足预热时间:压测前先让应用运行5-10分钟,等JIT完成编译后再开始
  2. 代码精简:小方法更容易被内联,拆分大方法为多个小方法
  3. 避免频繁变更代码:JIT编译后的机器码会缓存,频繁重启会丢失编译结果
  4. 保持稳定流量:JIT基于运行数据优化,稳定的请求模式让JIT更有针对性
5.2 2026版推荐配置
# 通用JIT推荐配置(JDK 17+)
-XX:+UseContainerSupport          # 容器感知
-XX:+TieredCompilation            # 分层编译(默认开启)
-XX:ReservedCodeCacheSize=512m    # 代码缓存(大应用可调大)
-XX:InitialCodeCacheSize=256m     # 初始代码缓存

# 调试/监控(生产慎用,有性能开销)
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintCompilation             # 需要时开启
-Xlog:jit*:file=/var/log/jit.log  # 输出到文件(JDK 9+)
5.3 代码层面的优化建议

✅ 有利于JIT优化的写法:

// 1. 小方法更容易被内联
private int add(int a, int b) { return a + b; }  // JIT喜欢!

// 2. 局部对象不逃逸 → 栈上分配
public void process() {
    StringBuilder sb = new StringBuilder();  // 不逃逸 → 栈上分配
    sb.append("data");
}

// 3. 避免不必要的synchronized
// StringBuffer在局部使用时,JIT会自动消除锁
public void build() {
    StringBuffer sb = new StringBuffer();  // JIT会消除锁
}

❌ 不利于JIT优化的写法:

// 1. 方法体太大 → 无法内联
public void bigMethod() { /* 几百行代码 */ }

// 2. 对象逃逸 → 堆上分配,GC压力大
private Person globalPerson;
public void process() {
    Person p = new Person();
    globalPerson = p;  // 线程逃逸!无法栈上分配
}

// 3. 频繁改变代码(热部署),编译结果被丢弃

六、避坑要点

错误/误区后果正确做法
压测一启动就开始结果偏低,未反映真实峰值性能先预热5-10分钟再压测
CodeCache设置太小JIT编译被禁用,性能下降大应用设置-XX:ReservedCodeCacheSize=512m
频繁热部署编译结果被丢弃,性能反复波动控制热部署频率,或采用灰度发布
在循环中创建大对象GC频繁复用对象或使用对象池
方法体过大无法内联,方法调用开销大拆分为小方法
全局变量持有局部对象对象逃逸,无法栈上分配减少全局变量的滥用

七、面试高频考点

Q1:什么是JIT编译器?Java为什么“越跑越快”?

JIT(Just-In-Time)编译器在运行时将热点字节码编译成本地机器码并缓存,后续直接执行机器码,无需重复解释。启动时解释执行保启动速度,运行中JIT持续优化热点代码,所以Java程序越跑越快。

Q2:C1和C2编译器的区别?

C1(Client Compiler)编译快、优化浅,用于启动阶段。C2(Server Compiler)编译慢、优化深,用于稳定运行后的峰值性能。分层编译将两者结合,兼顾启动速度与峰值性能。

Q3:分层编译的5个层级是什么?

0层:解释执行;1层:C1无profile编译;2层:C1有限profile编译;3层:C1全量profile编译;4层:C2极致优化编译。代码从0层开始,热度上升后逐级晋升到4层。

Q4:逃逸分析是什么?能带来哪些优化?

逃逸分析判断对象是否逃逸出方法或线程。基于分析结果可实现:①栈上分配(不逃逸对象在栈上,减轻GC);②标量替换(对象拆散为基本类型);③锁消除(单线程锁直接移除)。

Q5:OSR(栈上替换)是什么?

OSR允许JIT在循环执行过程中将解释执行的代码替换为编译后的机器码。即使循环还没结束,JIT编译完成后也能“中途上车”,切换到机器码执行。

🎤 面试官追问陷阱(加分题)

追问1:“-XX:+PrintCompilation输出中,编译层级4代表什么?”

👉 代表C2编译器的极致优化编译,是JIT的最高级别。代码经过4层编译后,性能接近原生语言。

追问2:“-XX:CompileThreshold参数的作用是什么?设置太小会怎样?”

👉 设置触发C2编译的方法调用次数阈值。设置太小→方法过早被编译,profile数据不足,C2优化深度不够;设置太大→热点代码长期处于解释执行,峰值性能延迟到达。

追问3:“为什么同样的代码,JVM运行几分钟后响应速度会提升数倍?”

👉 启动时代码以0层解释执行,性能一般;运行中JIT识别热点代码,逐步从C1编译过渡到C2编译;稳定后核心热点代码已全部编译为4层机器码,直接执行无需解释,峰值性能大幅提升。

八、练习题

  1. 分析题:某服务刚启动时QPS只有1000,运行10分钟后QPS达到5000。分析可能的原因。

  2. 场景题:StringBuilder在局部方法中创建,JIT会做哪些优化?

  3. 代码题:使用-XX:+PrintCompilation观察一个循环方法被JIT编译的过程,观察编译层级的变化。

📊 你的学习进度

  • 当前:第66篇 / 共108篇 · 进阶篇:JVM调优与故障排查(第61~70篇)
  • ✅ 已完成:基础篇44篇 + 第45~66篇
  • 📖 正在学:第66篇
  • ⏳ 待学习:第67~108篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

👉 下一篇文章预告

🚀 下一篇:《第67篇:JVM面试压轴题》

内容简介:30+道JVM大厂高频面试题,覆盖内存模型、GC、类加载器、JIT、调优实战,附标准话术+加分回答。

👉 JVM调优专题收官之作,面试必看!

📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!

【Infracture】【数据中心】第十三篇 Ai infra中的“现象→根因→方案→关键参数/落地”01 现象:同步 RL step 里 99 分位输出长度是中位数的几倍到几十倍,整批等最慢几条;CoT/数学/代码尤甚,GPU 空泡严重,generation 占整体 50–80%、推理任务可到 80%+。根因方案矩阵落地红线:staleness K 先小(1→2→调),长尾不丢弃只延后;记录每条轨迹 policy_version、tokenizer_version、logprob、expert_route,便于重算 advantage 时做 off‑policy 修正。部署形态:gateway(router)→ 阅读详情

相关推荐

SpringBoot支持动态更新配置文件参数

本文介绍SpringBoot在不重启服务的前提下动态刷新配置参数的实现方案。文章通过自定义DynamicPropertyUpdater与ConfigFileReloader组件,结合Environment属性源操作,实现单个配置项更新、批量更新以及重新加载整个配置文件,并给出接口测试步骤与效果验证。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 16

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 9583

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3253

《Java 100 天进阶之路》第67篇:JVM面试压轴题(2026版)

摘要:JVM调优专题收官之作!精选 35+ 道大厂高频JVM面试题,覆盖7大模块:内存区域(五大运行时区、堆栈区别、元空间vs永久代)、垃圾回收(6款回收器、G1原理、ZGC、引用类型)、GC调优(四步闭环、核心参数、FullGC排查)、类加载器(双亲委派、打破双亲委派、热部署)、JIT编译(分层编译5层级、逃逸分析、方法内联)、OOM排查(5种OOM类型、五步排查流程、核心工具链)。附3道面试官追问陷阱+4道练习题。JVM面试,一篇通关!

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1218

LIO-SAM运行报错‘process has died’?别慌,一个命令搞定libmetis.so库路径问题

本文详细解析了LIO-SAM运行中常见的‘process has died’报错问题,特别是由libmetis.so库路径错误导致的节点崩溃。通过一个简单的命令移动库文件到正确位置,即可快速解决这一问题,同时提供了多种替代方案和预防措施,帮助开发者更好地理解Linux动态库加载机制和ROS环境管理。

weixin_29231221的博客 201

TI IWR 6843 ISK 毫米波雷达开箱测试

TI IWR6843 ISK毫米波雷达上手体验,教程十分详细,对于新手很友好。

qq_57061492的博客 4017

《Java 100 天进阶之路》第65篇:OOM与内存泄漏排查(2026版)

摘要:JVM调优专题第五弹!从5种OOM类型(Heap Space、Metaspace、Direct Buffer、GC Overhead、Thread)到内存泄漏 vs 内存溢出的本质区别,从五步排查流程(看日志→jstat监控→jmap dump→MAT分析→修复验证)到5大泄漏场景(静态集合、未关闭资源、ThreadLocal、内部类、类加载器),从核心工具链(jstat、jmap、MAT、VisualVM、Arthas)到堆快照截断应急处理。附生产必备JVM配置、避坑清单、面试高频考点与追问陷阱。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 567

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1559

《Java 100 天进阶之路》并发编程与JUC通关总结:从线程基础到并发容器,一套吃透Java高并发全链路(2026版)

摘要:第51~60篇并发编程专题正式收官!一张学习路线图 + 十张速查表 + 34 道高频面试题 + 避坑清单,系统覆盖线程生命周期与虚拟线程、synchronized 锁升级全流程、volatile 与 JMM 内存模型、AQS 底层原理(state/CLH队列/模板方法)、线程池七大参数与 Executors 陷阱、死锁排查与预防、CompletableFuture 异步编排、CAS 原子类与 LongAdder 分段累加、ThreadLocal 内存泄漏根治。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 291

[Dify实战] 招投标标书智能生成:模板套用 + 风险校验

摘要:本文提出基于Dify构建AI标书生成工作流,解决传统标书撰写中内容重复(80%复用率)、人工修改效率低、风险检查易出错等痛点。方案包含三大核心模块:1)智能生成(基于模板自动填充项目信息);2)风险校验(AI自动检查废标风险点);3)多角色协作。通过拆分标书结构、设置详细Prompt、建立风险检查清单,实现从"人工撰写"到"参数化自动生成+AI审核"的转型,最终输出标准格式文档并支持企业系统集成。典型应用场景下,系统能自动生成技术方案并识别关键风险(如支付安全合

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 819

零基础入门红外与可见光图像融合:DAF-Net 实战全指南

本文介绍了基于DAF-Net的红外与可见光图像融合技术,主要内容包括:技术原理、环境配置、数据准备和模型实现。DAF-Net通过双分支特征提取和动态注意力融合机制,有效结合红外图像的热辐射信息与可见光图像的纹理细节。文章详细讲解了开发环境搭建步骤(Python 3.8+PyTorch),TNO数据集的预处理方法,并提供了完整的DAF-Net实现代码,包含特征提取、注意力融合和图像重建三个关键模块。该技术可广泛应用于安防监控、自动驾驶等领域,帮助开发者快速入门多模态图像融合。

FJN110的博客 118

Mythos安全大模型:从漏洞发现到利用链生成的工程化实践

大模型在网络安全领域的应用正从概念验证迈向真实攻防落地。以Mythos为代表的新型AI安全模型,不再局限于静态代码扫描或规则匹配,而是融合深度推理、动态工具调用与实时系统建模能力,实现端到端漏洞定位、可复现利用链生成与绕过缓解机制的自动化分析。其技术价值在于将专业级渗透测试压缩至小时级,显著降低中小组织的安全审计门槛。典型应用场景包括开源项目无人值守审计、政务微服务合规渗透、工业固件离线漏洞挖掘等。本文聚焦Mythos在真实环境中的能力边界、部署策略与提示工程方法论,结合SWE-bench Pro、Cybe

weixin_33924220的博客 335

Yandex复杂还原验证码识别

本文分析了Yandex滑动验证码的识别方法,指出其通过JS判断正确滑动位置而非用户交互还原图像。核心思路是通过像素差异分析,将验证码图像重组后(分为3×3或4×4),计算相邻图像间的像素差异,最小值即为正确位置。与前期某象验证码识别方法类似,需结合图像增强技术统一像素直方图。文章强调该方法仅供学习参考,严禁用于违法行为。完整识别流程包括图像重组、像素差异计算等步骤,最终可准确定位正确拼图位置。

码王吴彦祖的博客 274

静态脱敏系统技术趋势分析

静态脱敏系统技术趋势分析要回答的不是买了哪些新功能,而是哪些能力正在变成出厂默认。本文从确定性脱敏、规则版本化、可逆受控与导出验签四条线,拆解趋势判断的可复算落点,并给出采购方可以直接核对的清单。

xingxiuer的博客 265

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

985小水博的摸鱼日常 454

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Maven 下载与配置教程(新手友好版)

本文档手把手教你在 Windows 系统上安装和配置 Maven,全程从官方渠道下载,安全可靠。

qq_36085846的博客 242

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

构造函数表达式的值类别是:prvalue

C++ 中构造表达式 T() 的结果为 prvalue,因其本质是“对象的初始化配方”而非已有对象。这一设计使编译器能强制执行复制消除(C++17起),直接在目标位置构造对象,实现零开销优化。即使类型不可拷贝或不可移动,也能合法初始化。同时,prvalue绑定引用时物化为xvalue,延长生命周期。该机制清晰区分初始化、移动与持久对象,是返回值优化和高效资源管理的语言基础。

jimy1的博客 480

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode100 1.两数之和

暴力枚举法时间复杂度为O(n²),空间O(1),直观但效率低。优雅解法利用HashMap,遍历中先查补数、后存当前值,平均时间复杂度O(n),空间O(n)。虽最坏情况(哈希冲突严重)理论可达O(n²),但Java 8+中链表超过8个元素转为红黑树,最坏退化至O(n log n),实际性能优异。

Shaoxingzong的博客 300

生产环境 Tomcat 200 线程跑满并报连接池超时:一次虚拟线程阻塞点排查

开启虚拟线程后线程告警消失,HikariCP 连接池超时却更早出现。先用 JFR 事件排除 `synchronized` 阻塞,再按并发预算重算连接池容量。

昨日种种,皆成今我。今日种种,皆成新我。 321

移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿

移动端卡顿常非代码瓶颈,而是调度问题。线程迁移、缓存失效、优先级反转、队列竞争等会显著增加等待时间,使相同工作耗时上升。需通过调度时间线区分运行与等待成本,分析核心类别、频率变化、锁状态及线程池负载。验证应控制变量,避免误判。修复关键在优化同步、控线程数、调优先级,而非盲目绑核。

m0_59437018的博客 247

DDD(领域驱动设计)篇四:退费 + 支付,三层 vs DDD 各撸一遍

DDD 不是一门新技术,而是一种纪律——业务规则集中放、用业务的语言放、放在划清的边界内。三层架构没有错,它只是没有回答"规则放哪"这个问题;DDD 回答了,代价是多写几个类、多学几个概念。 代码会写了,再读书就不抽象了。推荐顺序: 《实现领域驱动设计》(Vaughn Vernon,"红书")——比原著(蓝书)好读得多,先读前半部分; 蓝书挑着读:只读"统一语言""限界上下文"两章。

Good good study,day day up 57

欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则

德法比推行企业间结构化电子发票(EN 16931)。本文讲金额怎么算才能过校验、怎么用 Python + saxonche 不装 Java 跑 XRechnung/Peppol 官方 Schematron,以及 Leitweg-ID 校验位这类官方规则查不到的坑,并介绍开源工具 eu-einvoice。

weixin_38859100的博客 234

Spring Boot的配置文件

本文介绍了Spring Boot中配置文件的使用,重点对比了application.properties与application.yml两种格式。properties为键值对形式,注释易乱码;yml语法更简洁,支持层级结构,优先级高于properties。通过@Value、@ConfigurationProperties可读取配置项,后者支持对象绑定。配置文件需统一格式,避免冲突。同时介绍了配置项读取流程及注解使用注意事项。

captain376的博客 237

若依项目新建业务模块

本文介绍了在若依框架中新建业务子模块的完整步骤:通过Maven创建子模块,引入ruoyi-framework依赖;在父工程中锁定子模块版本;在ruoyi-admin中添加依赖并刷新Maven;最后重启项目即可成功加载新模块。图文结合,清晰展示操作流程,确保模块集成顺利。

weixin_50379372的博客 157

LeetCode Hot 100 · 双指针 3 题 Java

LeetCode Hot 100 · 双指针 3 题,覆盖 11 盛最多水的容器、15 三数之和、42 接雨水,主线是排序 / 双指针 / 前缀最值与「短板效应」。

2401_88612756的博客 352

基于 Spring Cloud Alibaba 的微服务架构设计与落地实践

本文介绍基于Spring Cloud Alibaba的微服务架构方案,整合Nacos、Sentinel、Seata、RocketMQ等组件,实现服务注册发现、配置管理、流量防护、分布式事务与消息驱动。通过统一版本管理、四层分层架构与按业务拆分的服务设计,结合Feign实现服务调用,配合动态配置刷新与降级容错,构建高可用、可扩展的微服务系统。

薛之谦 202
上一篇: 《Java 100 天进阶之路》第65篇:OOM与内存泄漏排查(2026版)
下一篇: 《Java 100 天进阶之路》第67篇:JVM面试压轴题(2026版)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值