HikariCP连接池原理与高并发调优:从核心机制到线上问题排查

有段时间我帮一个朋友做线上问题排查,晚高峰时段某个服务的日志里开始不断刷出Connection is not available, request timed out,但数据库端连接数远没到上限,CPU、内存也都平稳。一群人先是怀疑网络,再是怀疑驱动,最后定位到根因时大家都没想到——就是 HikariCP 数据库连接池的配置问题,而且不是单纯“把参数调大”就能解决的。

那次之后我对连接池的理解彻底变了。它不是一个简单的“放一堆连接”的容器,而是高并发场景下数据库访问的节流阀。HikariCP 能在 Spring Boot 里成为默认连接池,靠的不是营销,而是它在极端竞争场景下的稳定表现。这篇文章我不打算写成像官方文档那样的参数对照表,而是从“为什么它快”“连接在池子里到底经历了什么”“线上遇到问题怎么排查”三个角度,把 HikariCP 从头到尾拆一遍。适合正在用 Spring Boot 做后端开发、想搞懂连接池原理、以及在压测或线上被连接池问题折磨过的同学。

1. 从连接池选型说起:为什么最后是 HikariCP

1.1 建立一条数据库连接到底贵在哪

很多人觉得“连接池不就是提前给你建好连接嘛”,但如果不搞清楚一条连接为什么贵,后面调优就只能是瞎猜。

一次普通的 TCP + MySQL 连接建立成本,至少包含这么几段:

  • TCP 三次握手,跨机房场景下这一轮就要几毫秒到几十毫秒;
  • MySQL 服务端的线程创建与认证,用户名密码校验、字符集协商、权限检查;
  • 客户端驱动初始化协议状态,分配缓冲区;
  • 如果开启了 SSL 或者数据库本身压力大,这一步还要更慢。

我曾在压测环境里随手测过:本地 MySQL 瞬时建立连接大约 2 到 5ms,跨机房情况下普遍要到 20 到 50ms。如果 QPS 有 200,每个请求都新建连接,光连接建立就占了可观的时间片。更麻烦的是数据库端要为每个连接创建独立线程、分配私有内存,连接数一旦破千,数据库的上下文切换和内存占用能直接把性能拖垮。

所以连接池的核心价值不只是“复用”,而是把“连接”变成一种可以被量化、控制、限流的稀缺资源。HikariCP 之所以成为 Spring Boot 的默认选择,是因为它在获取连接的平均延迟、极端竞争下的吞吐量这两个指标上,长期稳定在同类库的前列。

1.2 主流连接池能力对比

市面上常见的 Java 连接池就那几个,我直接列一张对比表,大家选型时可以有个直观感受。

维度HikariCP社区常用连接池ADBCPTomcat JDBC
性能表现极高,热路径代码精简中上,但功能较重一般较好
监控能力基础指标,支持JMX/Micrometer自带丰富监控面板、SQL审计弱弱
SQL 拦截/审计不支持支持不支持不支持
Spring Boot 默认是否否否
JAR 体积不到 200KB较大一般一般

我不否认带监控的连接池在运维场景里的价值,但从连接池本身的职责来看,HikariCP 做的减法是有意为之。它把资源全部压在“快速借出连接”和“快速归还连接”这条热路径上,宁可不要花哨功能,也要保证每次getConnection()的延迟足够低。

1.3 “光”这个名字背后的设计目标

Hikari 在日语里就是“光”的意思。作者给这个库起这个名字,目标是做成一个极轻量、极快速的连接池。整个项目代码量出奇地少,想想看,一个核心 JAR 不到 200KB,背后是每一行代码都经过反复打磨的结果。

这种“小而快”的风格影响了后续所有的设计取舍。比如它不像那些重量级连接池一样内置一堆过滤器链,很多功能你以为是“没做”,实际上是作者故意不做。理解了这个定位,你再去看它的源码和配置项就会顺很多。

2. 核心机制拆解:一个连接在 HikariCP 里的完整旅程

2.1 池的初始化:连接不是一上来就全部拉满

很多人以为连接池启动时就会把maximumPoolSize全部创建好,其实不是。HikariCP 初始化时只会按minimumIdle创建连接。默认情况下minimumIdle和maximumPoolSize相等,所以你会看到池子一开始就是满的;但如果把minimumIdle设成 0,第一次请求才触发连接创建,启动很快,代价是第一个请求会慢一些。

连接创建不是一个线程逐个 new 的,而是通过PoolBase.newConnection()走完整套驱动初始化。创建失败时 HikariCP 会做退避重试,而不是疯狂重连把数据库打挂。这个细节在生产上非常重要,尤其是数据库刚好在重启或网络抖动时。

2.2 借出连接:FastPath 与 ConcurrentBag 怎么配合

当业务代码调用dataSource.getConnection()时,真正执行的是ConcurrentBag.borrow()。我把它简化成三个步骤:

  1. FastPath 尝试:先从当前线程的 thread-local 列表中取最近归还的连接,如果状态可用,直接拿走;
  2. 没命中,再从全局共享列表里遍历,挑一个空闲连接并原子标记为“已借出”;
  3. 仍然拿不到,就阻塞在 handoffQueue 上,等待其他线程归还连接或者超时。

这里最核心的设计在第一步。大部分后端应用的请求线程是相对固定的,归还的连接大概率会被同一个线程再次借用,所以这条线程局部缓存路径的命中率非常高。高命中率意味着大多数getConnection()根本不需要触碰全局并发数据结构,竞争自然就少了。

2.3 归还连接:close() 不是真的关闭

必须强调一个非常容易混淆的概念:你从 HikariCP 拿到的 Connection 根本不是原生物理连接,而是一个代理对象。

调用connection.close()时,代理对象会把这层调用拦截下来,把底层物理连接归还给 ConcurrentBag,并唤醒正在等待连接的线程,而不是真的把 socket 关掉。物理连接只有在超过maxLifetime、或检测到已不可用、或连接池正在收缩时,才会被真正销毁。

理解这一点,你才能看懂为什么连接池的指标里有activeConnections和idleConnections的区别。也才能理解为什么连接泄漏这么难排查——业务代码把“归还连接”这件事搞砸了,池子里的连接数就只会越来越少,但数据库端完全看不出异常。

2.4 池的自我维护:housekeeper 与空闲连接回收

HikariCP 内部有一个 HouseKeeper 线程,默认每 30 秒运行一次,做三件事:

  • 根据maxLifetime把“活得太久”的连接销毁重建,避免连接在数据库端被意外老化;
  • 根据idleTimeout和minimumIdle,把过度空闲的连接回收,缩到最小值;
  • 如果开启了keepaliveTime,对空闲连接做心跳探测,防止被数据库中间件提前断开。

这里有个容易踩的细节:idleTimeout只在minimumIdle < maximumPoolSize时才有意义。如果你把两个值设成一样,池子永远维持固定连接数,空闲回收逻辑永远不会触发。这不算 bug,而是设计如此。

另一个细节是maxLifetime。默认 30 分钟,它应该小于数据库侧的超时时间。如果数据库wait_timeout是 8 小时,那默认值没问题;但很多 DBA 会把wait_timeout调成几分钟来防止空闲连接占用资源,这时候如果你不把maxLifetime调小到低于数据库超时时间,连接会被数据库提前掐掉,应用还傻傻地以为连接是好的,等真正执行 SQL 时直接报通信链接失败。

3. 性能的秘密:HikariCP 那些激进的设计选择

3.1 FastList:为连接池特定场景定制的数据结构

先看一个特别小的优化,但能反映 HikariCP 的风格。

JDK 的ArrayList.remove(Object)是从前往后遍历,找到目标再移除;而连接池的使用模式是“后归还的连接大概率先被借走”,并且移除时经常要移除指定位置的元素。HikariCP 的 FastList 把remove(Object)改成从后往前遍历,同时砍掉了get(index)的越界检查,也不实现 List 接口的完整方法。

单个方法的性能差异可能是纳秒级的,但在高并发下,每次借出连接都要走一遍remove和get,积少成多就是可观的 CPU 消耗。FastList 的思路是:不做一个通用容器,只做一个最适配连接池场景的容器。

3.2 字节码生成代理类:拒绝反射

连接池免不了要对 Connection 做代理,但代理的方式直接决定了热路径的开销。

在 JDK 动态代理的方案里,每次调用任何方法都要经过InvocationHandler.invoke()的反射转发,这个开销在高频调用下相当可观。HikariCP 的做法是启动时用 Javassist 直接生成字节码,生成一个实现了 Connection 接口的类,方法体内直接调用目标连接的方法。

换句话说,代理对象的方法调用几乎等同于直接调用,中间没有反射层。这个设计属于那种“源码看着很绕,但性能收益非常直接”的操作。

3.3 ConcurrentBag:ThreadLocal 优先的无锁并发方案

ConcurrentBag 是整个连接池的并发核心。它不是一个大而全的并发集合,而是专门为“借出/归还”场景设计的。

它的结构由三部分拼成:线程局部的 List、全局共享的 CopyOnWriteArrayList、以及一个用于交接的 SynchronousQueue。借出连接时优先走 ThreadLocal,全局遍历只在局部未命中时才发生,归还连接时会唤醒正在等待的线程。因为大多数操作不触碰全局共享结构,所以才敢说“无锁优先”。

这个设计需要理解一个点:它不是不锁,而是把锁控制在极低频的路径上。扩容、移除、状态流转这些操作仍然会有同步开销,但真正高频的“取走最后一个连接”和“放回一个连接”已经尽量绕开了全局锁。

3.4 功能做减法:为什么监控和拦截迟迟不丰富

HikariCP 不提供 SQL 审计、不提供慢查询拦截、不提供可视化监控面板,这些功能在某些重量级连接池里是招牌,但 HikariCP 选择不做。

不是做不到,而是刻意为之。每一层过滤器、每一个统计计数器,都会在“每次数据库操作”这个路径上增加东西。监控数据你可以通过 Micrometer 和 JMX 拿到基础指标;真正的 SQL 审计建议交给数据库本身的能力,或者 ORM 框架层的插件,而不是在连接池里拦截。

所以选型时要先想清楚:你到底是需要一个连接池,还是需要一套带监控的数据库访问治理平台。如果是后者,HikariCP 不适合你;如果只是想把连接管理做好,它几乎是无短板的选择。

3.5 连接断开的快速感知:SQLState 的妙用

数据库连接断开这种事没法完全避免。很多连接池的做法是每次借出时用isValid()或探活 SQL 验证一遍,HikariCP 没有这么做,因为每次探活本身就是一次额外开销。

它的机制是:如果业务拿到连接后第一次执行 SQL 抛出的异常 SQLState 以08开头(比如通信链接失败08S01),HikariCP 会认为连接已经不可用,立刻销毁这个连接,并自动从池中重新取一个连接重试一次。

代价是那一次 SQL 已经失败过一遍,但换来的是绝大多数情况下无需探活。对这种取舍,线上高并发场景通常更倾向于后者,因为失败重试本身可以被事务边界兜住。

4. 配置项不是越多越好:关键参数的取舍与调优思路

4.1 先理解 HikariCP 的默认参数

我见过不少人一来就把配置写了几十行,其实大部分默认值已经足够合理。先看核心参数,知道每个参数在什么场景下才需要动。

参数默认值作用调整时机
maximumPoolSize10池中最大连接数根据并发和事务耗时计算
minimumIdle与 maximumPoolSize 相同池中保持的最小空闲连接数需要收缩空闲资源时调小
connectionTimeout30000ms等待获取连接的最大时间业务对延迟敏感时可调小
idleTimeout600000ms空闲连接超过该时间会被回收仅在 minimumIdle < maximumPoolSize 时生效
maxLifetime1800000ms连接最大存活时间必须小于数据库侧超时时间
validationTimeout5000ms连接有效性校验的超时时间探活场景下需要放宽
leakDetectionThreshold0(关闭)连接泄漏检测阈值排查问题时开启
keepaliveTime0(关闭)空闲连接的心跳探测间隔数据库中间件会回收空闲连接时开启

看到没,真正让你在调优的其实只有四五个参数,大部分场景改动maximumPoolSize和maxLifetime就够了。

4.2 连接池大小到底怎么算

我在很多团队都见过同一个错误:以为连接数越大越好。实际上连接数一旦超过数据库的吞吐上限,多出来的连接全在排队,反而增加了上下文切换。

一个有用的估算思路是这样的:

假设你的目标 QPS 是 500,平均每个请求占用数据库连接的时间是 50ms,那么一个连接每秒最多能完成 20 个请求(1000ms / 50ms),需要连接数就是 500 / 20 = 25。再留 30% 的缓冲,取 33 左右。

公式可以简化为:连接数 ≈ QPS × 平均连接占用时间(秒)。

这里要特别注意“平均连接占用时间”不是 SQL 执行时间,而是从连接被借出到被归还的完整时间,事务里的远程调用、业务计算都要算进去。很多人以为 50ms 是 SQL 执行耗时就够了,结果事务里塞了一个 300ms 的 HTTP 调用,连接基数完全不够用,池子瞬间被打满。

4.3 与数据库端参数联动:maxLifetime 和 wait_timeout

连接池不是独立系统,它跟数据库端的参数是强耦合的。最典型的联动是maxLifetime和 MySQL 的wait_timeout。

MySQL 默认wait_timeout是 8 小时,数据库会关闭空闲超过这个时间的连接。如果应用侧连接的存活时间超过它,就会出现“池里的连接表面上还在,实际上已经被数据库端杀掉”的情况。所以maxLifetime必须小于数据库的超时时间,默认 30 分钟在绝大多数场景都没问题。

另一种情况是数据库端max_connections很紧张,比如只有 100,而你有多个应用实例,每个实例配了 30 个连接,加一起就超了。这时连接数不是看单个应用,而是得算所有实例的连接总量。

4.4 Spring Boot 下的配置示例

直接给一份我常用的配置模板,方便抄:

spring: datasource: hikari: pool-name: OrderHikariPool minimum-idle: 10 maximum-pool-size: 30 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 validation-timeout: 5000 # 开启泄漏检测,60秒未归还则告警 leak-detection-threshold: 60000

注意 Spring Boot 配置用的是短横线命名,而原生 HikariCP 参数是驼峰命名,迁移配置时要特别注意。这个配置里的leak-detection-threshold平时不建议生产开启,因为它会额外记录连接栈信息,有性能开销,排查问题时开一下就好。

4.5 从其他连接池迁移时的参数映射

很多团队是从其他连接池迁过来的,最头疼的就是参数对不上。我列个常用映射表,能省不少事。

原连接池参数HikariCP 对应参数说明
initialSizeminimumIdle初始连接数
maxActivemaximumPoolSize最大连接数
minIdleminimumIdle最小空闲连接数
maxWaitconnectionTimeout获取连接的最大等待时间
timeBetweenEvictionRunsMillis无直接对应由 housekeeper 线程自动维护
testWhileIdle / testOnBorrow无直接对应通过 maxLifetime 和 keepaliveTime 配合实现连接健康检查

迁移最大的坑就是习惯性寻找“类似参数”然后一一对应,但 HikariCP 的架构决定了它压根不需要那么多维护型参数。宁可先保持默认,用监控数据来指导调整。

5. 高并发现场踩坑记录:连接池调优的真正分水岭

5.1 连接泄漏:连接池被掏空的隐形杀手

连接泄漏是最常见、也最隐蔽的问题。表面现象是:系统跑一段时间后,activeConnections一直居高不下,新的请求开始超时,重启就好一阵子。

排查思路按顺序来:

  1. 开启leakDetectionThreshold,设置一个比正常事务耗时大一些的值,比如 60 秒;
  2. 观测日志里是否出现Connection leak detection triggered,它会打印出连接被借出时的调用栈;
  3. 如果日志没法准确抓到,用jstack抓线程栈,找大量阻塞在getConnection()上的线程;
  4. 检查代码里所有的try-with-resources是否覆盖完整,尤其是异常分支。

这里有个心得:连接泄漏不是靠“小心”能杜绝的,尽量在 DAO 层统一使用try-with-resources,或者让 ORM 框架统一管理连接,别在业务代码里随手getConnection()然后忘记关闭。

5.2 连接池满了但数据库很闲,问题不在池

「池满」不等于「数据库连不上」。很多次压测时发现连接池到了上限,但数据库端连接数还很低,CPU 也闲着。这种时候,第一反应不是调大maximumPoolSize,而是查连接被谁占着。

最典型的原因是事务边界过大。比如在事务里调远程接口、做耗时计算、甚至睡眠等待,事务一直不提交,连接就一直被占用。表面上池子不够用,实际是每个连接的利用效率太低了。

排查时可以看数据库端information_schema.innodb_trx(以 MySQL 为例),看哪些事务长时间不结束,代码定位到对应事务边界,把非数据库操作移出事务。这一步做完,往往不用调连接池,问题就消失了。

5.3 服务刚启动时的连接预热

默认情况下如果minimumIdle设得比较低,服务刚启动后第一次请求会触发连接的创建,延迟特别明显。对于追求稳定延迟的线上服务,建议把minimumIdle设得和maximumPoolSize相等,相当于启动即预热。

如果不想占那么多连接,也可以在应用启动后的监听器里主动执行一条简单 SQL,把池子预热到合理水位。这个操作虽然简单,但在压测初期非常管用。

5.4 压测时怎么看连接池的真实状态

压测时很多人只看接口 TPS 和 P99,忽略了连接池自身的指标,这是不对的。建议把 HikariCP 的这几个指标盯住:

  • totalConnections:当前池中总连接数;
  • activeConnections:正在被业务占用的连接数;
  • idleConnections:空闲连接数;
  • pendingConnections:正在排队等待获取连接的线程数。

pendingConnections是一个关键信号。如果它持续增长,要么连接数确实不够,要么事务耗时过长导致连接周转不过来。这时候再结合平均事务耗时,按上面那个公式重新算一遍连接数,比拍脑袋调参靠谱得多。

Spring Boot 项目可以通过 Actuator 暴露这些指标,接入 Micrometer 就能在监控面板里看到曲线。没有监控面板的话,也可以在压测时用 JMX 手动看一眼。


最后说点个人体会。连接池调优最容易陷入的误区,就是把所有参数都调一遍,显得很专业。但我实际排查下来,真正的线上问题绝大多数出在事务边界、连接泄漏、以及应用和数据库参数不配套这三类上,连接池参数反而很少需要大改。HikariCP 默认值已经照顾了大部分场景,你要做的不是把参数拧到极致,而是先保证连接在正确的时机被借出、在正确的时机被归还。把这个基本盘稳住,再谈最大连接数、空闲回收这些精细调节,才有意义。

相关新闻

网狐6.6完整源码内核拆解:消息分发、房间调度与二次开发实战

网狐6.6完整源码内核拆解:消息分发、房间调度与二次开发实战

简介&#xff1a;网狐6.6完整源码是一套经典网络游戏平台源代码&#xff0c;面向具备C基础、希望深入理解游戏服务端架构或进行二次开发的开发者。该版本已升级至Visual Studio 2008编译环境&#xff0c;标签中特别标注包含内核&#xff0c;意味着除界面与功能实现外&#xff0…

2026/10/20 17:02:23 阅读更多 →
Trivy依赖树实战:从漏洞报告到根源追踪的完整指南

Trivy依赖树实战:从漏洞报告到根源追踪的完整指南

做漏洞扫描的同学应该都经历过这种场面&#xff1a;报告一拉出来&#xff0c;几十个高危CVE&#xff0c;第一反应不是害怕&#xff0c;而是懵。高危列表里每个条目都写着“影响组件&#xff1a;xxx”&#xff0c;但真正难搞的问题是——这个组件到底是通过哪条链进到我镜像里的…

2026/10/20 17:02:23 阅读更多 →
PMSM永磁同步电机FOC矢量控制原理与MATLAB仿真模型实践指南

PMSM永磁同步电机FOC矢量控制原理与MATLAB仿真模型实践指南

一说到永磁同步电机&#xff08;PMSM&#xff09;控制&#xff0c;很多人第一反应就是抱着一本PDF从数学推导开始啃&#xff0c;结果三天之后连Clark变换和Park变换都没分清楚就放弃了。我见过太多这种情况了&#xff0c;不是大家学习能力不行&#xff0c;而是路径选错了。纯粹…

2026/10/20 17:02:23 阅读更多 →

最新新闻

Qt课程进度导航栏G03:从数据模型到自绘渲染的完整实践

Qt课程进度导航栏G03:从数据模型到自绘渲染的完整实践

做教育类桌面客户端的时候&#xff0c;课程导航一直是个绕不开的活儿。用户要在一个窗口里看到章、节、课时的层级关系&#xff0c;要清楚自己学到哪了&#xff0c;还得能一键跳回上次退出的位置。市面上的现成组件大多只解决“展示目录”这一层&#xff0c;进度状态、学习记忆…

2026/10/20 17:53:47 阅读更多 →
软件设计师上午题解题切片:真题陷阱、能力断点与命题逻辑拆解

软件设计师上午题解题切片:真题陷阱、能力断点与命题逻辑拆解

简介&#xff1a;本资源为2025年下半年全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试——软件设计师科目上午卷的真题解析与标准答案全集&#xff0c;专为备考该认证的计算机专业技术人员设计&#xff0c;聚焦基础知识巩固、解题逻辑训练与应试策略提升。…

2026/10/20 17:53:47 阅读更多 →
卫星姿态轨道控制Simulink仿真实践:从翻滚到对地定向的完整闭环

卫星姿态轨道控制Simulink仿真实践:从翻滚到对地定向的完整闭环

想真正弄明白卫星姿态轨道控制&#xff0c;光看资料是不够的。我见过不少人手里攒着好几份讲义和开源工程&#xff0c;每个模块单独看都能讲出头头是道&#xff0c;但要自己在Simulink里搭一条“从翻滚状态到对地定向稳定”的完整闭环&#xff0c;就卡住了。这篇博文就是一次卫…

2026/10/20 17:53:47 阅读更多 →
Microsoft Agent Framework迁移指南:从Semantic Kernel到自治AI代理

Microsoft Agent Framework迁移指南:从Semantic Kernel到自治AI代理

1. 项目概述&#xff1a;这不是一次简单的工具替换&#xff0c;而是一场底层思维的迁移“.NET AI 生态系统的重构与演进&#xff1a;Microsoft Agent Framework 对 Semantic Kernel 的继承、超越与战略整合”——这个标题里藏着一个被很多人忽略的关键事实&#xff1a;它不是在…

2026/10/20 17:53:47 阅读更多 →
每瓦Token成AI工厂新KPI,NVIDIA全栈升级如何提升能效

每瓦Token成AI工厂新KPI,NVIDIA全栈升级如何提升能效

AI算力圈最近都在聊一个新词&#xff1a;每瓦Token。这玩意儿不是厂商营销造出来的概念&#xff0c;而是实实在在成了衡量AI数据中心“生产效率”的硬指标。过去大家比的是峰值算力&#xff0c;也就是FP16、FP8下的TOPS数值&#xff0c;现在风向明显变了&#xff0c;大家开始盯…

2026/10/20 17:53:47 阅读更多 →
JMeter接口测试进阶:从参数化、断言到结果分析的核心能力

JMeter接口测试进阶:从参数化、断言到结果分析的核心能力

做接口测试这行&#xff0c;接触JMeter是早晚的事。早年我还在手工点接口文档、拿浏览器调试工具一个个试请求的时候&#xff0c;第一次用JMeter跑通一个几十线程的并发场景&#xff0c;那感觉确实挺新鲜。但说句实在话&#xff0c;从“会用JMeter”到“能把接口测试做出价值”…

2026/10/20 17:52:45 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →