【JVM原理详解】57-GC调优方法论与案例分析
GC 调优方法论与案例分析引言GC 调优是 JVM 性能优化的深水区。很多人认为调优就是调几个参数但盲目调参往往适得其反——调好了是经验调坏了是事故。真正的 GC 调优是一个有目标、有基线、有验证的系统工程。本篇先建立 GC 调优的方法论框架再通过三个真实案例——CMS 碎片迁移 G1、G1 Mixed GC 停顿调优、ZGC 高堆表现——展示方法论的实际应用最后给出生产环境 GC 参数推荐清单。GC 调优目标调优的第一步不是改参数而是明确目标。GC 调优有两个核心方向通常不可兼得需要根据业务特点取舍。吞吐量优先吞吐量 应用运行时间 / (应用运行时间 GC 时间)。吞吐量优先意味着允许单次 GC 停顿较长但总 GC 时间占比低。适用 GCParallel GCJDK 8 默认适用场景批处理、离线计算、大数据分析、后台任务关键指标GC 时间占比 1%对停顿不敏感# Parallel GC 吞吐量参数-XX:UseParallelGC-XX:GCTimeRatio99# GC 占比目标 1/(991)1%-XX:MaxGCPauseMillis500# 允许较长停顿换取吞吐延迟优先延迟指 GC 造成的 STW 停顿时间。延迟优先意味着严格限制单次 GC 停顿即使牺牲部分吞吐。适用 GCG1 GCJDK 9 默认、ZGCJDK 15 生产可用适用场景Web 服务、交易系统、实时交互、API 网关关键指标P99 停顿 200msG1或 10msZGC# G1 延迟优先参数-XX:UseG1GC-XX:MaxGCPauseMillis100# 目标停顿 100ms# ZGC 超低延迟-XX:UseZGC# 停顿 1msJDK 16吞吐量 vs 延迟的权衡 吞吐量优先 延迟优先 Parallel GC G1 / ZGC ┌──────────┐ ┌──────────┐ │ GC 少但长 │ │ GC 多但短 │ │ 总时间少 │ │ 单次极短 │ │ 适合批处理 │ │ 适合交互 │ └──────────┘ └──────────┘调优方法论GC 调优不是玄学而是一个可复迭代的五步闭环确定目标 → 收集基线 → 分析瓶颈 → 调整参数 → 验证效果 ↑ │ └──────────── 循环迭代 ←────────────────────┘第一步确定目标明确业务对 GC 的要求量化为具体指标业务类型吞吐目标延迟目标推荐 GCWeb API 95%P99 200msG1交易系统 98%P99 50msZGC (JDK 17)批处理 99%不敏感Parallel混合负载 95%P99 200msG1没有目标就不要调优——没有衡量标准就无法判断调优是否有效。第二步收集基线调优前必须了解当前 GC 状况作为对比基准。核心数据来源是GC 日志。# 确认 GC 日志已开启JDK 11/17-Xlog:gc*:file/var/log/gc/gc.log:time,uptime,level,tags:filecount10,filesize50m收集至少 24 小时的 GC 日志覆盖业务高峰和低峰期。用GCEasygceasy.io或JDK Mission Control分析重点关注GC 频率Young GC / Full GC 各多少次停顿时间平均、P90、P99、最大值吞吐量GC 时间占比内存回收效率每次 GC 回收了多少内存第三步分析瓶颈根据基线数据定位瓶颈所在现象可能原因方向Young GC 频繁新生代太小增大新生代 / RegionFull GC 频繁老年代不足 / 内存泄漏排查泄漏 / 增大堆单次停顿过长GC 算法不适合换 G1 / ZGCMixed GC 停顿长Region 回收数过多调 IHOP / Region 大小Concurrent Mode FailureCMS 并发回收跟不上降 CMSInitiatingOccupancyFraction第四步调整参数一次只改一个参数这是调优的铁律。同时改多个参数无法判断哪个起了作用。每次调整后记录参数变更和效果变化。第五步验证效果用与基线相同的负载和时长重新收集 GC 日志对比关键指标。如果改善则保留否则回滚。建议至少验证一个完整的业务周期含高峰期。案例分析 1ParNewCMS 频繁 Full GC → 迁移 G1背景某社交平台 Feed 服务堆 8GJDK 8使用 ParNew CMS。随用户增长Full GC 频率从每天 1-2 次上升到每小时 3-4 次每次停顿 2-3 秒接口超时告警频发。基线分析# 当前参数-Xms8g-Xmx8g-Xmn3g-XX:UseParNewGC-XX:UseCMSCompactAtOldCollection-XX:CMSInitiatingOccupancyFraction70-XX:UseCMSInitiatingOccupancyOnlyGCEasy 分析 24 小时 GC 日志Young GC: 423 次, 平均 45ms, 总耗时 19.0s Full GC: 82 次, 平均 2.8s, 总耗时 229.6s ← 瓶颈 吞吐量: 94.2% 最大停顿: 4.1s分析瓶颈Full GC 频繁的原因是CMS 老年代碎片化。CMS 使用标记-清除算法不做内存压缩长时间运行后老年代碎片严重。大对象无法分配时触发Concurrent Mode Failure退化为 Serial Old 做 Full GC标记-压缩单线程极慢。# GC 日志中的碎片化迹象[GC(CMS Concurrent Mode Failure)]← CMS 跟不上退化为 Full GC[Full GC(Allocation Failure)[Tenured: 5242880K-4198320K-5242880K,2.834secs]# 老年代回收前后大小几乎不变5242M - 4198M - 5242M# 说明碎片化严重回收后仍然满调整方案迁移 G1CMS 在 JDK 9 已被废弃JDK 14 彻底移除。G1 整体回收、局部压缩避免碎片化且停顿可控。# 迁移到 G1JDK 8 也支持 G1-Xms8g-Xmx8g-XX:UseG1GC-XX:MaxGCPauseMillis200-XX:G1HeapRegionSize8m-XX:InitiatingHeapOccupancyPercent45-XX:ParallelRefProcEnabled移除-Xmn3gG1 自行管理新生代设置 Region 大小 8M8G 堆推荐IHOP 设为 45%。验证效果迁移后 GCEasy 分析同一时段 GC 日志Young GC: 612 次, 平均 38ms, 总耗时 23.3s Mixed GC: 89 次, 平均 145ms, 总耗时 12.9s Full GC: 0 次 ← 完全消除 吞吐量: 97.8% (3.6%) 最大停顿: 210ms (从 4.1s 降至 210ms)Full GC 归零最大停顿从 4.1 秒降到 210ms吞吐提升 3.6 个百分点。接口超时告警消失。案例分析 2G1 Mixed GC 停顿过长 → 调 IHOP 和 Region背景某金融交易系统堆 16GJDK 11G1 GC。MaxGCPauseMillis 设为 100ms但实际 P99 停顿达 350ms偶发超过 500ms影响交易延迟 SLA。基线分析Young GC: 356 次, 平均 42ms Mixed GC: 48 次, 平均 320ms, P99350ms ← 瓶颈 吞吐量: 96.5%Young GC 停顿正常42ms问题出在Mixed GC。分析瓶颈Mixed GC 回收新生代 部分老年代 Region。停顿过长的原因有两个单次回收 Region 数过多G1 根据MaxGCPauseMillis估算能回收多少 Region但估算偏乐观。IHOP 过低InitiatingHeapOccupancyPercent35之前为降低 Full GC 风险调低了导致并发标记过早启动Mixed GC 回收的 Region 中垃圾比例低回收效率差需要回收更多 Region 才有效果。# GC 日志分析 Mixed GC 回收情况[GC pause(G1 Evacuation Pause)(mixed)(young)(initial-mark)Eden regions:120-0(120)Survivor regions:16-16(16)Old regions:820-760(820)← 一次回收了60个 Old Region[Times:user1.2sys0.05,real0.32secs]← 停顿 320ms一次 Mixed GC 回收 60 个 Region16G 堆Region8M evacuation复制存活对象耗时过长。调整方案# 调整前-XX:MaxGCPauseMillis100-XX:G1HeapRegionSize8m-XX:InitiatingHeapOccupancyPercent35# 调整后-XX:MaxGCPauseMillis100-XX:G1HeapRegionSize16m# Region 从 8M 增大到 16M-XX:InitiatingHeapOccupancyPercent45# IHOP 从 35% 提到 45%-XX:G1MixedGCCountTarget16# Mixed GC 拆成更多轮次默认 8-XX:G1OldCSetRegionThresholdPercent10# 单次 Mixed GC 最多回收 10% 的 Old Region调整逻辑Region 增大到 16M16G 堆下 Region 从 2048 个降到 1024 个减少 Region 管理开销。更大的 Region 也让 G1 的停顿预测更准确。IHOP 提到 45%让并发标记更晚启动此时老年代中垃圾比例更高Mixed GC 回收效率提升同样停顿预算下回收更多垃圾。G1MixedGCCountTarget16将 Mixed GC 的回收工作拆成更多轮次每轮回收更少 Region单次停顿更短。G1OldCSetRegionThresholdPercent10限制单次 Mixed GC 最多回收 10% 的 Old Region默认无限制时可能回收过多控制单次停顿。验证效果调整前 调整后 Young GC: 42ms (356次) Young GC: 45ms (342次) Mixed GC: 320ms (48次) Mixed GC: 95ms (72次) ← 停顿降 70% P99 停顿: 350ms P99 停顿: 105ms ← 满足 100ms 目标 吞吐量: 96.5% 吞吐量: 96.2% ← 略降可接受Mixed GC 停顿从 320ms 降到 95msP99 从 350ms 降到 105ms满足 SLA。吞吐量略降 0.3% 是可接受的代价——这正是延迟优先调优的预期权衡。案例分析 3ZGC 在高堆32G下的表现背景某大数据实时查询平台堆 48GJDK 17原使用 G1 GC。大堆下 G1 的 Mixed GC 停顿可达 500ms-1s影响查询 P99 延迟。业务目标P99 停顿 20ms。G1 在 48G 堆下的表现Young GC: 156 次, 平均 180ms, P99220ms Mixed GC: 24 次, 平均 680ms, P99950ms ← 远超目标 Full GC: 2 次, 平均 3.2s 吞吐量: 93.1%G1 的停顿随堆增大而增加需要扫描更多 Region48G 堆下 Mixed GC 接近 1 秒无法满足 20ms 目标。迁移 ZGCZGCZ Garbage Collector使用染色指针和读屏障技术将大部分 GC 工作放在并发阶段STW 停顿不随堆大小增长。# ZGC 配置JDK 17-Xms48g-Xmx48g-XX:UseZGC-XX:SoftMaxHeapSize36g# 软上限ZGC 尽量维持堆在此值以下-XX:ZAllocationSpikeTolerance2# 允许 2 倍分配速率突增-XX:ConcGCThreads8# 并发 GC 线程数-XX:ParallelGCThreads16# STW 阶段线程数关键参数说明SoftMaxHeapSizeZGC 的软目标堆低于此值时 GC 压力小高于此值时 GC 频率增加。设为 Xmx 的 75%36G/48G给业务波动留余量。ZAllocationSpikeTolerance控制并发分配的预备程度值越大 ZGC 越早启动并发回收应对突发分配更从容。ZGC 表现GC 类型 次数 平均停顿 P99停顿 最大停顿 Minor GC 384 0.8ms 1.2ms 2.1ms Major GC 42 1.1ms 1.5ms 2.8ms ← 并发标记周期 Full GC 0 - - - 吞吐量: 95.8%ZGC 的所有 STW 停顿均在3ms 以内P99 仅 1.5ms且不随 48G 堆大小增长。吞吐量从 93.1% 提升到 95.8%G1 的 Mixed GC 停顿消耗的时间被释放给业务。ZGC 的适用边界ZGC 不是银弹适用场景有边界维度ZGC 优势ZGC 劣势堆大小8G ~ 16TB停顿不随堆增长小堆 4G优势不明显停顿 1msJDK 16-吞吐量大堆下优于 G1小堆下略低于 G1读屏障开销JDK 版本JDK 15 生产可用JDK 11/12 为实验特性内存开销-染色指针需要 64 位元数据占额外空间选型建议堆 8GG1 足够ZGC 优势不明显堆 8G ~ 32GG1 主力延迟敏感场景可试 ZGC堆 32GZGC 优势显著停顿稳定JDK 17 低延迟场景ZGC 首选生产环境 GC 参数推荐清单4G 堆 / G1通用 Web 服务-Xms4g-Xmx4g-XX:UseG1GC-XX:MaxGCPauseMillis200-XX:G1HeapRegionSize4m-XX:InitiatingHeapOccupancyPercent45-XX:ParallelRefProcEnabled-XX:MetaspaceSize256m-XX:MaxMetaspaceSize512m-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath/data/dump/ -Xlog:gc*:file/var/log/gc/gc.log:time,uptime,level,tags:filecount10,filesize50m8G 堆 / G1中大型应用-Xms8g-Xmx8g-XX:UseG1GC-XX:MaxGCPauseMillis200-XX:G1HeapRegionSize8m-XX:InitiatingHeapOccupancyPercent45-XX:G1MixedGCCountTarget12-XX:ParallelRefProcEnabled-XX:ConcGCThreads4-XX:ParallelGCThreads8-XX:MetaspaceSize256m-XX:MaxMetaspaceSize512m-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath/data/dump/ -Xlog:gc*:file/var/log/gc/gc.log:time,uptime,level,tags:filecount10,filesize50m32G 堆 / ZGC超低延迟JDK 17-Xms32g-Xmx32g-XX:UseZGC-XX:SoftMaxHeapSize24g-XX:ZAllocationSpikeTolerance2-XX:ConcGCThreads6-XX:ParallelGCThreads12-XX:MetaspaceSize512m-XX:MaxMetaspaceSize1g-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath/data/dump/ -Xlog:gc*:file/var/log/gc/gc.log:time,uptime,level,tags:filecount20,filesize100m吞吐量优先 / Parallel批处理JDK 8/11-Xms8g-Xmx8g-Xmn3g-XX:UseParallelGC-XX:UseParallelOldGC-XX:GCTimeRatio99-XX:MaxGCPauseMillis500-XX:ParallelGCThreads8-XX:MetaspaceSize256m-XX:MaxMetaspaceSize512m-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath/data/dump/ -Xlog:gc*:file/var/log/gc/gc.log:time,uptime,level,tags:filecount10,filesize50m通用附加参数所有场景推荐-XX:DisableExplicitGC# 禁用 System.gc()防止第三方库干扰-XX:AlwaysPreTouch# 启动时预触摸内存减少运行时缺页-XX:ExitOnOutOfMemoryError# OOM 后退出配合容器自动重启实践要点调优原则默认值优先JDK 11/17 的 G1 默认配置经过大量优化80% 的应用无需调参即可满足需求。先压测默认值确认不达标再调。一次只改一个参数这是科学实验的基本要求。同时改 IHOP、Region、MaxGCPauseMillis出问题无法定位是哪个参数的锅。相同负载验证调参前后必须用相同的压测流量和时长对比否则数据不可比。建议准备可重复的压测脚本。监控持续运行GC 日志 Prometheus JMX exporter 持续监控不只看调优当下要观察长期趋势。常见误区堆越大越好G1 的 Mixed GC 停顿随堆增长48G 堆下 G1 停顿可能秒级。大堆应考虑 ZGC。MaxGCPauseMillis 越小越好设得太小如 20ms会导致 G1 每次只回收极少 RegionGC 频率暴增吞吐骤降。200ms 是合理起点。盲目关 GC 日志省性能GC 日志开销 0.1%但关闭后出问题无法分析。生产环境必须开启。调优能解决一切如果应用每秒产生 1GB 垃圾如循环中创建大量临时对象任何 GC 调优都无济于事。代码层面的优化比 GC 调优更重要——减少对象分配才是根本。小结调优目标吞吐量优先选 Parallel延迟优先选 G1/ZGC两者通常需要权衡。明确目标是调优的前提。方法论五步法确定目标 → 收集基线GC 日志→ 分析瓶颈 → 调整参数一次一个→ 验证效果形成闭环迭代。案例 1CMS→G1CMS 标记-清除导致老年代碎片化频繁 Concurrent Mode Failure。迁移 G1 后 Full GC 归零停顿从 4.1s 降至 210ms。案例 2G1 Mixed GCMixed GC 停顿过长通过增大 Region8M→16M、提高 IHOP35%→45%、增加 Mixed GC 轮次P99 从 350ms 降至 105ms。案例 3ZGC 高堆48G 堆下 G1 停顿近 1 秒迁移 ZGC 后所有停顿 3ms且不随堆增长。堆 32G 的低延迟场景首选 ZGC。核心原则先用默认值压测一次只改一个参数相同负载验证代码优化优先于 GC 调优。

相关新闻

用这套免费模板,15分钟画出一张能进论文的神经网络架构图

用这套免费模板,15分钟画出一张能进论文的神经网络架构图

用这套免费模板,15分钟画出一张能进论文的神经网络架构图 【免费下载链接】Neural-Network-Architecture-Diagrams Diagrams for visualizing neural network architecture 项目地址: https://gitcode.com/gh_mirrors/ne/Neural-Network-Architecture-Diagrams …

2026/10/11 6:17:51 阅读更多 →
铃木退出中国:从“小车之王”到市场边缘的战略误判与启示

铃木退出中国:从“小车之王”到市场边缘的战略误判与启示

1. 一个时代的背影:从“小车之王”到市场边缘最近,一则关于“铃木正与长安协商解约,或将全面退出中国市场”的消息在汽车圈内不胫而走。虽然官方尚未发布最终公告,但结合铃木在华近几年的市场表现和战略收缩,这条传闻的…

2026/10/16 13:50:39 阅读更多 →
Adobe-GenP 3.0 修补实战:4 项事前检查与 5 个关键时刻,让 Adobe CC 2019–2023 跳出试用期

Adobe-GenP 3.0 修补实战:4 项事前检查与 5 个关键时刻,让 Adobe CC 2019–2023 跳出试用期

Adobe-GenP 3.0 修补实战:4 项事前检查与 5 个关键时刻,让 Adobe CC 2019–2023 跳出试用期 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP …

2026/10/17 0:35:05 阅读更多 →

最新新闻

自监督学习全解析:核心原理、三大技术路线与实战避坑

自监督学习全解析:核心原理、三大技术路线与实战避坑

这几年如果你在关注人工智能,很难绕开一个词:自监督学习。BERT的掩码预测、GPT的下一词预测、SimCLR的对比损失、MAE的随机遮块重建……名字各不相同,底层逻辑却高度一致:让模型从原始数据里自己构造问题、自己寻找答案&#xff0…

2026/10/17 8:47:25 阅读更多 →
Android扫码开发实战:基于ZXing core的相机预览与解码优化

Android扫码开发实战:基于ZXing core的相机预览与解码优化

简介:一套面向 Android 开发者的二维码与条形码扫描功能实践资料,基于 ZXing 开源库,完整覆盖依赖接入、扫描界面定制、相机权限处理与扫描结果回调等关键环节,适合需要快速集成扫码能力或做二次开发的移动应用工程师。压缩包共 1…

2026/10/17 8:47:25 阅读更多 →
自适应滑动窗口:破解RAG系统幻觉难题的工程实践

自适应滑动窗口:破解RAG系统幻觉难题的工程实践

看到这个题目我就乐了,“知之为知之,不知为不知”——这句老话用来概括RAG(检索增强生成)系统的痛点,可以说是精准到骨子里了。大模型最大的问题不是它不懂,而是它经常一本正经地“不懂装懂”;R…

2026/10/17 8:47:25 阅读更多 →
Kaggle自然场景图片分类实战:从数据增强到迁移学习全流程解析

Kaggle自然场景图片分类实战:从数据增强到迁移学习全流程解析

这次要聊的就是3.4 Kaggle自然场景图片分类这个项目。把六类自然照片区分开,听起来不难,但真正上手跑一遍之后你会发现,最花时间的不是搭网络,而是搞懂数据、调好增强、选择合适的预训练权重怎么配合。我以一次完整的实战过程为主…

2026/10/17 8:47:25 阅读更多 →
treg:轻量级本地信任注册中心,解决LLM工具链密钥安全断点

treg:轻量级本地信任注册中心,解决LLM工具链密钥安全断点

1. 项目概述:treg 是什么?它解决的不是“密钥管理”,而是开发者工作流中的信任断点treg 这个名字乍看像某个新出的 CLI 工具缩写,或是某类加密协议代号,但结合 OpenRouter、CLI、SKILL.md、codex cli 等高频共现词&…

2026/10/17 8:47:25 阅读更多 →
MSCDRUN.DLL丢失报错全解析:从原理到实操的完整修复指南

MSCDRUN.DLL丢失报错全解析:从原理到实操的完整修复指南

很多朋友可能都遇到过这种情况:正开着某个软件或者游戏,突然屏幕一弹,跳出一个“无法启动此程序,因为计算机中丢失MSCDRUN.DLL”或者“找不到MSCDRUN.DLL”的报错,接着软件就崩了,死活打不开。今天咱们就专…

2026/10/17 8:46:25 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →