代码热修复原理与实战:从JVM到Android的在线救火指南
凌晨一点的告警群里值班同事发来一条异常堆栈某个线上接口的空指针开始成群出现错误率以肉眼可见的速度往上跳。按照平时流程改代码、走测试、构建镜像、发版重启最快也要二十来分钟可每一秒都在产生新的失败请求。这时候能让代码不重启就生效的“代码热修复”技术就是救火队员。这篇文章我想把热修复这件事从头到尾捋一遍它背后的原理是什么、不同平台有哪些玩法、什么时候该用什么时候不该用以及我亲手在服务端和客户端踩过的一些坑。无论你是后端开发、客户端开发还是专职做运维和稳定性保障这篇文章都值得你花十分钟读完关键时刻能帮你少掉几根头发。1. 代码热修复到底是什么从“停机发布”到“不停机救火”1.1 和传统发布相比热修复究竟“热”在哪传统的一次代码发布相当于给一台运行中的机器换发动机。你得先把车停下来把旧引擎拆掉再把新引擎装好最后重新点火启动。这个过程中服务是断的哪怕你用了负载均衡做分批发布总有一部分流量要等新实例起来后才恢复。整个过程涉及构建、回归、灰度、观察耗时不短。热修复的思路完全不同。它更像给行驶中的汽车更换一个零件发动机不停、车轮不停你通过某种方式把出问题的那个零件单独换掉。放到程序里就是进程不重启只把某个类、某个方法、某段逻辑在内存中替换成新版本。对用户来说服务一直在线对开发来说修复时间从“分钟级发版”压缩到“秒级生效”。这种能力在两类场景里尤其值钱。一类是线上紧急事故多等一分钟都是钱和口碑的损失另一类是移动端发版成本极高的场景客户端应用受应用商店审核周期限制一个紧急 Bug 如果走正常发版要等好几天用户早就在评论区炸锅了。所以移动端一度把热修复当成标配能力服务端则把热更新看作高可用架构的一部分。1.2 热修复能解决什么、不能解决什么很多刚接触热修复的朋友容易把它想成万能的实际上它的边界非常清晰。先说能解决的第一线上逻辑错误比如空指针、算错金额、判断条件写反。这类问题改的是方法体内部的逻辑不涉及结构变动最适合热修。第二数据兼容性修补比如某个字段多了一种取值原本的解析代码处理不了通过热修兼容新数据。第三紧急安全漏洞来不及走完整发版流程时可以先热修止血再补正式版本。再说不适合热修甚至禁止热修的场景。第一数据库表结构变更。热修复改的是内存里的代码改不了已经落盘的存量数据更不会自动帮你迁移字段。第二接口协议不兼容。对外接口的入参出参如果发生破坏性变更只改服务端代码没用调用方还是按老协议在传数据硬改只会引发更多报错。第三涉及资源文件、Native 库大范围调整。这类变更往往还牵扯打包产物结构热修很难覆盖完整。第四强一致性的配置类变更比如线程池大小、熔断阈值这类参数通常应该走配置中心而不是改代码。记住这条原则热修复是止血手段不是常规开发流程的替代品。能用发版解决的问题不要拖到线上用热修来补。2. 拆开热修复的底层机制一切都在吃平台的“动态性”2.1 JVM 系类加载器与字节码重定义要理解 JVM 里的热修复绕不开两个核心机制类加载器和字节码转换。JVM 中一个类能否被识别由“类全限定名 定义它的类加载器实例”共同决定。类加载不是每次用到都从头读一遍字节码而是遵循双亲委派模型先让父加载器尝试加载父加载器加载过的类子加载器不会重复加载。这意味着如果你在运行时往某个 ClassLoader 里塞一个同名同包的新类而系统里已经加载过旧类什么都不做的话JVM 还是会返回旧类。所以 JVM 系热修复的关键不是“加载新类”而是“重定义已加载的类”。JDK 提供了一套名为 Instrumentation 的 API配合 Java Agent 机制可以在运行时修改已加载类的字节码。核心流程是通过 Attach 机制连接目标 JVM拿到 Instrumentation 实例注册一个 ClassFileTransformer调用 retransformClasses 让目标类重新经过一次转换流程转换器返回的新字节码会被 JVM 采纳并替换掉原来方法体的实现。这套机制最早是给调试器用的后来被大量 APM 监控、链路追踪工具发扬光大现在也是服务端热更新的主流底层原理。类似的思路还体现在 JVM 的 HotSwap 功能上只不过 HotSwap 只支持方法体级别的调试替换限制很多生产环境更多还是走 Instrumentation。2.2 Android 系ClassLoader 与 so 修复Android 本质上也是 JVM 家族成员不过它用的是 Dalvik/ART 虚拟机加载的是 dex 文件而不是普通 class 文件。热修复的基本思路和 JVM 类似既然同名类由同一个 ClassLoader 加载后不会更新那就绕过原来的 ClassLoader用一个新的 ClassLoader 去加载包含修复代码的 dex再让修复后的类优先于旧类被找到。这里有个关键技巧利用类加载器的树形结构。新建一个子 ClassLoader让它先加载补丁 dex 中的类如果找不到再委托给父 ClassLoader。只要把补丁 dex 排到系统类加载路径之前同名类就会优先命中新版本从而在 App 不重启的情况下完成类级替换。补丁包通常很小只包含变更过的类用差分算法做增量下载流量成本可以压得很低。Android 的热修复还有一个分支是 Native 层修复。有些 Bug 藏在 so 文件里改 Java 代码没用需要替换整个 so。做法是把 patch so 放到 App 私有目录在加载 so 时让系统优先加载补丁版本。这个方向实现起来复杂得多要处理 ABI 差异、符号兼容等问题一般团队不会轻易触碰基本是头部厂商的专项能力。资源文件修复也是类似逻辑默认资源加载不走 ClassLoader而是通过 AssetManager需要额外 hook 资源加载路径。2.3 iOS 系的动态化路线与合规边界iOS 平台因为系统封闭性没有 Android 那样的 ClassLoader 机制但 Objective-C 的运行时是高度动态的可以在运行时替换方法实现。这就是很多人熟悉的 Method Swizzling交换某个类的两个方法指针让旧方法名指向新实现。围绕这个思路曾经出现过一批以 JavaScript 为脚本语言、通过 JavaScriptCore 引擎与 OC Runtime 交互的框架。开发者把修复逻辑写成 JS 脚本下发客户端解释执行再通过桥接调用原生方法实现了类似热修复的效果。这里必须明确一条合规边界。移动端动态化能力受平台方审核政策约束非常明显苹果官方对“包含下载代码并执行”的行为有明确限制。很多曾经的方案因此受到冲击一些框架停止维护社区也转向更保守的技术路线。所以 iOS 侧现在的主流策略是尽量在“允许的解释执行范围”内做事比如用 Swift 的协议化设计预留动态配置能力或者把可变的业务规则放到服务端下发数据客户端只做数据驱动渲染。一句话总结iOS 热修复能做但约束比 Android 多得多选型时务必慎之又慎。2.4 脚本化宿主解释器天然适合热更新前面讲的都是编译型语言Java 要先编译成字节码Objective-C 的代码也要经过编译链接。如果换一个思路直接在程序里嵌一个脚本引擎把经常变化的逻辑用脚本语言实现那么热修复就变成了“替换一段脚本文件”完全没有底层字节码操作的复杂度。游戏行业最爱这么干。很多游戏的核心战斗数值、活动规则都写在 Lua 脚本里服务器或客户端想要调整只要下发新的脚本文件再 reload 即可玩家无感。服务端也有大量规则引擎用 Groovy、Python、JavaScript 实现动态规则因为解释执行的语言天然允许“加载新代码”不需要字节码注入这种黑科技。脚本化思路的代价也很明显性能比编译型语言低复杂的类型系统会限制代码规模而且为了把宿主能力暴露给脚本你得设计一整套桥接 API这部分工程量和维护成本容易失控。我的建议是如果你的业务天然存在大量规则变更一开始就把脚本引擎设计进去而不是事后补热修。3. 方案选型不同端、不同场景下的技术地图3.1 主流方案对比表先给一张选型地图方便对照自己的场景去定位端侧主流手段生效粒度关键约束服务端 JavaInstrumentation Agent方法级、类级需要 Attach 权限部分环境受限服务端脚本场景Lua/Groovy/JS 脚本 reload脚本文件级需要提前埋脚本引擎Android 客户端ClassLoader 补丁 dex类级复杂继承场景兼容性差Android Nativeso 补丁替换so 级ABI 适配复杂成本高iOS 客户端JS 脚本 运行时替换方法级平台审核限制明显需合规评估嵌入式/C动态库替换模块级需要显式封装动态加载接口3.2 选型的四个关键维度第一个维度是生效粒度。你希望这次修复影响多大范围一个方法、一个类还是一个完整的业务模块粒度越粗热修的成本通常越低但回滚越难。脚本化方案天然是模块级的换一个脚本文件字节码方案通常是类级或方法级需要精确控制变更范围。第二个维度是平台约束。服务端相对自由JVM 自己就提供了官方 APIAndroid 要常驻进程能拿到补丁无法覆盖冷启动即崩溃的极端场景iOS 则必须把合规放在第一位方案选型的前提是不触碰平台红线。错过一条轻则功能被禁用重则影响整个应用市场策略。第三个维度是维护成本。字节码方案听起来强大但团队必须有人能读懂汇编级产物能处理混淆、加固之后的字节码还原这门槛不低。脚本方案对开发者的要求低一些但脚本引擎本身要长期维护。很多团队是被“成熟的开源方案”吸引进来的结果发现为了适配自己的插件化框架改动量远超预期。第四个维度是安全边界。热修复能力本质上是远程代码执行能力一旦下发通道被攻破攻击者可以直接控制你的业务逻辑。所以通道加密、补丁包签名校验、最小权限原则、审计日志一样都不能少。安全能力不是上头要求时才补的应该在选型阶段就纳入架构设计。3.3 为什么移动端热修从“火热”变得“谨慎”前几年移动端热修复几乎是头部 App 的标配理由很简单App 发版审核周期长一个让用户无法登录的 Bug等审核通过黄花菜都凉了。热修复能救命于是出现了一批热修框架有的走 dex 替换有的走 so 替换有的走解释执行脚本。后来的转折来自两方面。一方面是平台方对“热更新”类行为的态度越来越明确动态下发可执行代码的风险被放大审视这直接让一批方案失去生存空间另一方面是热修复本身引入了新的稳定性问题补丁兼容性差、混淆后类无法匹配、资源冲突、极端机型上崩溃率居高不下修复一个 Bug 反而制造更多 Bug 的例子屡见不鲜。现在很多团队的做法是把可变的、非关键的逻辑尽量做成服务端配置下发必须发版的 Bug 用自动化灰度发布来加速实在要热修的紧急事故先小范围灰度再逐步放量。这套“配置优先、发布加速、热修补位”的组合拳比单纯依赖热修复要稳健得多。记住热修复只解决 0.1% 的场景不要为了这 0.1% 把 99.9% 的正常发布流程搞复杂。4. 实操服务端 Java 进程的热更新全流程4.1 环境准备与模拟故障纸上谈兵没意思我带你跑一遍真实的服务端热更新流程。这一步走通了以后遇到线上事故至少知道从哪里下手。实验环境就三样一个本地或者测试环境跑的 Java 服务JDK 版本选 Java 8 或 Java 11 都行一个能连接目标进程的终端一个提前打好的 Agent jar。服务不需要复杂一个标准的 Spring Boot Web 应用即可重点是有一个能复现故障的入口。我来模拟一个场景OrderService.calcAmount方法里有一个 NPE 是因为某个折扣字段为 null 导致的现在要求不重启服务、只把方法逻辑修正。先给目标服务加上 JVM 参数让它在启动时一并加载 Agent或者用运行时 Attach 也行。为了演示运行时热修我准备用 Attach 方式这样不需要调整启动参数。java -javaagent:/path/to/hotfix-agent.jar -jar demo-service.jarAgent 的入口类需要实现premain和agentmain两个方法。premain是启动时触发的agentmain是运行时 Attach 触发的。我通常两个都写调试的时候各取所需。4.2 用 Agent 机制实现类级热替换Agent 是 Java 5 就提供的能力核心类就是Instrumentation。拿到它之后可以注册一个ClassFileTransformer这个 Transformer 会在类加载时被回调我们在这里修改字节码。先写一个简单的 Transformer。用 Javassist 来改方法体比直接操作 ASM 要直观很多public class HotfixTransformer implements ClassFileTransformer { Override public byte[] transform(ClassLoader loader, String className, Class? classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { if (!com.example.OrderService.replace(., /).equals(className)) { return null; } try { ClassPool pool ClassPool.getDefault(); pool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer)); CtClass cc pool.get(com.example.OrderService); CtMethod m cc.getDeclaredMethod(calcAmount); m.setBody({ System.out.println(\[hotfix] calcAmount invoked\); if (discount null) { discount BigDecimal.ONE; } return basePrice.multiply(discount); }); byte[] byteCode cc.toBytecode(); cc.detach(); return byteCode; } catch (Exception e) { e.printStackTrace(); return null; } } }这段代码的大致逻辑判断当前正在加载的类是不是目标类是的话用 Javassist 读取类信息找到方法用一段新方法体覆盖旧实现返回新的字节码数组。注意一点transform方法里的类名是 JVM 内部表示斜杠形式不能用点分隔。有了 Transformer 还不够addTransformer之后必须对已经加载的类显式触发重转换否则只对后续新加载类生效。触发方法如下inst.addTransformer(new HotfixTransformer(), true); inst.retransformClasses(Class.forName(com.example.OrderService));retransformClasses会让 JVM 重新执行一次已加载类的转换流程新的字节码直接替换内存中的旧实现。这个动作执行后不需要重启进程下一次调用就是新代码。4.3 用开源诊断工具快速完成 redefine自己撸一套 Agent 对业务团队来说维护成本太高实际生产我更推荐用现成的诊断工具。很多 Java 开发者熟悉的诊断工具都内置了热更新能力其中最常用的就是 Arthas 的retransform和redefine命令。操作非常直观。先把要更新的编译产物放到服务器某个目录比如/tmp/OrderService.class。进入 Arthas 交互界面之后执行retransform命令retransform -c 1a2b3c /tmp/OrderService.class-c参数是目标类的 ClassLoader 的哈希值用sc -d com.example.OrderService可以查到。这一步不能省因为线上服务往往有多个业务 ClassLoader不指定的话工具无法确定要把字节码应用到哪个加载器下的类。执行成功后工具会提示retransform success。紧接着调用一次接口观察日志或返回值就能看到新逻辑已经生效。真的到了这步你会发现整个过程比想象中快很多体感上就是一两条命令的事。两类命令有区别retransform会走完整的 Transformer 链会触发热修复类上的注解、代理等逻辑redefine则直接替换字节码不走 Transformer 链也更接近底层。日常修 Bug我一般用retransform因为行为和 Instrumentation 机制一致排查问题的时候更容易预期。4.4 热修复代码的下发与回滚设计热修做完不是结束还要考虑补丁包从哪下发、怎么校验、失败了怎么回滚。服务端热更新常见的下发方式就是运维平台自定义命令把包含新 class 的补丁包上传到目标机器由运维或工具执行 retransform。这里有一个非常重要的设计补丁包必须签名。最简单的做法是预先放一对公私钥在跳板机和目标机器上上传时附带签名执行工具先验签再应用。因为热修实质是远程代码执行通道不可信等于给别人开后门。签名校验我建议用 RSA 而不是简单的 MD5MD5 只能保证完整性不能保证真实性。哪怕内部团队也要假设存在内部人员误操作的可能程序化校验远比肉眼确认可靠。回滚设计往往是被忽略的点。好多人热修完就撤了等发现问题时发现旧代码没了只能用老版本重新打包发布。我的习惯是任何一次热修操作之前先用反编译工具把目标类当前字节码 dump 一份存档回滚时直接用这份存档做一次 redefine等于把现场还原。比走完整发版流程快得多也避免了恢复老版本带来的连锁风险。5. 热修复排坑实录现象、原因与速查表5.1 类加载器不一致最常见的坑我第一次在生产环境做热修就撞上了NoSuchFieldError。补丁类明明是照着源码改的运行时报找不到字段。排查下来发现问题出在类加载器上。JVM 里类之间的关联是基于同一个 ClassLoader 的如果补丁类由系统类加载器加载而它的父类或它引用的字段由业务容器加载器加载两边 ClassLoader 不同JVM 会认为它们完全不相干。新的类加载后没有找到预期字段直接崩。后来我养成了习惯每次 retransform 之前先查目标类的 ClassLoader 哈希确保补丁类放到正确的 ClassLoader 路径里。多 ClassLoader 的服务尤其要注意补丁可能同时打到多个上下文不要只认一个。5.2 状态残留方法换了缓存没换还有一个隐蔽的坑热修改了方法逻辑但静态缓存还是旧的。比如某个静态 Map 里存了配置数据热修替换了读取配置的方法可 Map 里的老数据还在新代码怎么跑都还是旧结果。解决办法是在热修方法入口加一个版本判断或状态清理逻辑。更通用的做法是把所有缓存都设计成可刷新的提供一个refresh()方法热修后主动调用一次。把这个动作也固化到热修脚本里确保每次变更都带上刷新流程。5.3 Transformer 副作用与内存泄漏Instrumentation 的 Transformer 注册之后如果没有及时移除会长期驻留在 JVM 里每次类加载都过一遍。如果你的 Transformer 里有类池引用、流没关干净这类问题累积下来就是元空间泄漏。我看到过一些 APM 类工具的实现对自己的 Transformer 既不注销也不清理时间一长服务整体变慢。所以自己实现 Agent 时要在agentmain里保留Instrumentation引用并在热修完成后调用removeTransformer把自己摘掉。还有一个细节retransformClasses只对已加载的类生效如果目标是接口、注解或者是 JVM 引导类加载器加载的类很多版本直接不支持测试时一定要避开这些类型。5.4 高版本系统限制与兼容矩阵JVM 侧热修相对自由但也不代表没有任何限制。高版本 JDK 对模块系统管得严有些内部控制类不允许重定义尝试重定义会直接抛异常。换到 Android 上就更明显Android 9 之后对非 SDK 接口的反射限制越来越强传统热修框架依赖的私有 API 调用很容易在部分机型上失效。做移动端热修唯一的办法就是建立真机兼容矩阵覆盖主流厂商系统版本和 SoC 平台尤其是国内多渠道 ROM 的差异。我见过一个团队线上热修灰度到 60% 的时候突然崩了一大片最后定位到是某款手机的系统 WebView 版本和补丁 dex 不兼容。这种问题在测试环境基本无法复现只有真机大规模覆盖才能发现。热修灰度比例一定要从小往大放别一上来就全量。5.5 常见问题速查表现象可能原因排查思路NoSuchFieldError / NoSuchMethodError类加载器不一致或补丁类引用缺失查目标类 ClassLoader核对补丁类的引用关系热修后代码没生效类没有被 retransform或补丁被同名旧类覆盖检查是否调用 retransformClasses检查类加载顺序内存持续增长Transformer 未移除或类池未清理用 jmap 查看元空间占用代码里移除 Transformer热修后业务数据异常静态缓存未刷新主动调用缓存刷新增加版本号判断只有部分机型崩溃兼容矩阵未覆盖建立真机矩阵热修灰度量逐步放大补丁包被篡改但未发现通道校验缺失补上签名校验和 HTTPS 传输堆栈行号错乱字节码转换丢失调试信息保留原始字节码与行号映射文件用反编译工具核对多提一句堆栈行号错乱这个事容易被人忽略。用 Javassist 改写方法体后源码行号往往对不上线上排障会非常痛苦。我现在的做法是打包热修字节码时把源文件 debug 信息带上同时在归档时保留一份未修改的原始版本。排查问题时先看异常栈再对照原始版本定位效率会高很多。另外热修的代码质量同样要过评审不能因为是紧急修复就绕过代码规范。我看过不少团队的热修代码注释没有、日志没有、异常吞掉修完一个问题埋下三个雷。热修代码应该和正式代码一样走 review、留下变更记录只是发布路径不同而已。热修不是法外之地越紧急越要冷静。我个人现在做事的顺序是接到线上问题先评估能否配置化解决不能则生成热修补丁补丁先签名再灰度灰度通过后正常发版流程兜底。热修只是流程中的一个工具不是全部。这套节奏跑下来线上事故的处理时间从过去的几十分钟压缩到几分钟稳定性反而更好。最后分享一个小技巧每次热修前先反编译一份当前运行版本的方法字节码并保存到固定目录下次回滚直接用它 redefine。这个习惯救过我很多次希望你用不到但一定要知道。

相关新闻

Vue+Laravel全栈开发实战:从API设计到部署上线的完整指南

Vue+Laravel全栈开发实战:从API设计到部署上线的完整指南

做全栈开发这些年,前后端技术选型我试过不少组合,从早期的服务端模板渲染,到后来的前后端分离,兜兜转转,VueLaravel这套组合是我用得最顺手、也最愿意推荐给团队新人的一套方案。Laravel把后端那些繁琐的事——路由、O…

2026/10/15 6:04:40 阅读更多 →
流水线模板一键克隆:终结配置漂移,构建标准化CI/CD

流水线模板一键克隆:终结配置漂移,构建标准化CI/CD

流水线模板一键克隆,我在团队里推了大半年,从最初“没人愿意用”到后来“新服务上线第一件事就是克隆模板”,这个转变过程踩了不少坑,也攒了不少心得。如果你在维护一个统一接入的流水线平台,或者只是负责某个项目的 C…

2026/10/15 6:03:40 阅读更多 →
基于单片机的无线充电系统毕设拆解:电磁感应传能与红外断电控制

基于单片机的无线充电系统毕设拆解:电磁感应传能与红外断电控制

简介:这份毕业设计文档围绕基于单片机控制的手机无线充电系统展开,面向电子信息工程、自动化等专业的在校学生及无线充电技术入门研究者,帮助读者理解从原理到实现的完整设计思路。压缩包内共1个doc文件,约1.19MB,内容…

2026/10/15 6:03:40 阅读更多 →

最新新闻

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

平时做运维的朋友肯定都有过这种经历:公司内部新起了一套系统,IP地址越来越多,今天要连这个、明天要连那个,总不能天天翻Excel表格。更尴尬的是,内网服务想用一个好记的域名访问,结果发现公共DNS根本不认识…

2026/10/15 7:37:59 阅读更多 →
ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

做Java开发的朋友,多少都被ConcurrentHashMap“教育”过。面试要问,源码分析要讲,线上排查高并发问题也绕不开它。而只要一聊到源码,1.7和1.8这两个版本的区别就是永远躲不开的坎:一个是Segment分段锁,一个…

2026/10/15 7:37:59 阅读更多 →
WinForm文本编辑器源码解析与高级功能扩展实战指南

WinForm文本编辑器源码解析与高级功能扩展实战指南

简介:这份C#文本/代码编辑器专题文档,面向具备一定C#基础、想从零构建或二次开发编辑器的研发人员,解决从界面搭建、文件操作到功能扩展各环节的关键问题。文档先讲解基于WinForm与RichTextBox的基础实现,包括字体加粗/斜体/下划线…

2026/10/15 7:37:59 阅读更多 →
微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

从技术视角看,在微信生态里"创建一个投票活动",本质是配置一套活动数据结构 报名审核状态机 防刷策略 数据导出能力。本文以「活动评选」场景为例,梳理从创建到发布的完整流程,并以投票帮小程序作为落地实践案例。 …

2026/10/15 7:37:59 阅读更多 →
T型三电平逆变器VSG自适应控制与并离网切换优化

T型三电平逆变器VSG自适应控制与并离网切换优化

1. 项目背景与核心价值电力电子变换器在新能源发电系统中扮演着关键角色,而T型三电平逆变器因其高效率、低损耗的特性,在中大功率场合得到广泛应用。传统逆变器控制策略在并离网切换过程中常面临暂态冲击大、同步性能差等问题,这正是虚拟同步…

2026/10/15 7:37:59 阅读更多 →
软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

说真的,看到“REA三天狂揽12万星”那条标题的时候,我第一反应是:这又是标题党?一个Agent,不用源码就能克隆一切软件,听起来太像营销号编出来的故事。但等我顺着链接把演示看完,又拿自己手头一个…

2026/10/15 7:36:59 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →