<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 并发编程·性能诊断与事故》 · 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E5%B9%B6%E5%8F%91%E5%B7%A5%E7%A8%8B/</link><description>Recent content in 《Java 并发编程·性能诊断与事故》 · 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 22:49:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E5%B9%B6%E5%8F%91%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 并发编程·性能诊断与事故》附录 B JCStress/JMH/压测模板</title><link>https://plumephp.com/java-conc-eng-appendix-b-templates/</link><pubDate>Wed, 28 Oct 2026 22:49:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-appendix-b-templates/</guid><description>三个可直接复制的模板：JCStress 0.16 的 Maven 工程含 proc full、可序列化 Result 与 toString 约定；JMH 1.37 的 pom 与基准类给出 -wi/-i/-w/-r/-f 参数和误差列读法；无第三方依赖的开环压测程序给 p50/p90/p99/p999 与拒绝计数。全部在本机实跑并贴真实输出。</description></item><item><title>《Java 并发编程·性能诊断与事故》附录 A 诊断命令速查</title><link>https://plumephp.com/java-conc-eng-appendix-a-diagnostics/</link><pubDate>Wed, 28 Oct 2026 22:48:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-appendix-a-diagnostics/</guid><description>按「我要知道什么」组织：线程用 Thread.print 与 dump_to_file 分开看平台线程和虚拟线程，JFR 用 jcmd 启动、view 读视图、configure 把 pin 阈值归零，内存看 class_histogram 与 GC 日志，CPU 用 macOS 的 top -pid 与 ps -M 替代 vmstat/pidstat，并单列本机不可用清单。</description></item><item><title>《Java 并发编程·性能诊断与事故》15.3 libraryd 并发验收与压测报告</title><link>https://plumephp.com/java-conc-eng-15-3-acceptance/</link><pubDate>Wed, 28 Oct 2026 22:47:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-15-3-acceptance/</guid><description>以 libraryd 借阅链路为被测系统，给出 64/256/1024 三档并发加单热点场景的完整验收报告：先写死 p99、错误率、吞吐、CPU 与 GC 判据，再用 111 行探针在 10 核 M1 Pro、负载 63 的本机实测，附原始输出、判定代码、遗留风险和可直接套用的模板。</description></item><item><title>《Java 并发编程·性能诊断与事故》15.2 Code Review 清单</title><link>https://plumephp.com/java-conc-eng-15-2-review-checklist/</link><pubDate>Wed, 28 Oct 2026 22:46:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-15-2-review-checklist/</guid><description>把 Code Review 从「看一眼」变成可阻断的流程：给出 20 条按后果分级的评审问题，每条包含为什么问、怎么验证、什么级别，讲清与卷二 15.3 检查清单的分工，并附三段式评审样例、ThreadLocal 泄漏的真实取证输出与一个可运行的评审闸门。</description></item><item><title>《Java 并发编程·性能诊断与事故》15.1 编码规范与静态检查</title><link>https://plumephp.com/java-conc-eng-15-1-coding-standard/</link><pubDate>Wed, 28 Oct 2026 22:45:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-15-1-coding-standard/</guid><description>把并发编码规范落成可执行条目：锁对象 private final 且不暴露、线程命名、池必须关闭、ThreadLocal 必须 remove、跨模块锁顺序与层号，并给出扩展卷二 15.3 的 X/Y/Z 三类规则的可运行检查脚本，附本机 javac -Xlint 与 20 处命中的真实输出。</description></item><item><title>《Java 并发编程·性能诊断与事故》14.3 K8s 下的并发参数基线</title><link>https://plumephp.com/java-conc-eng-14-3-k8s-baseline/</link><pubDate>Wed, 28 Oct 2026 22:44:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-14-3-k8s-baseline/</guid><description>同样的 2 vCPU，为什么 requests-only 的 Pod 开 63 个线程、limits=2 的 Pod 每 100 ms 被冻结一次？本节用 cpu.max、cpu.stat 与实测间隔证明 availableProcessors 看不见 CFS 节流，给出 1/2/4/8 核四档 requests、limits、堆、线程池与探针的基线表和一份完整 Deployment。</description></item><item><title>《Java 并发编程·性能诊断与事故》14.2 内存限制、线程栈与容器 OOM</title><link>https://plumephp.com/java-conc-eng-14-2-memory-stack/</link><pubDate>Wed, 28 Oct 2026 22:43:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-14-2-memory-stack/</guid><description>容器 limit 256 MiB、堆只开了 128 MiB，进程却被 Killed，日志里一行 Java 异常都没有。本节拆开 MaxRAMPercentage 的默认 25%、-Xss 的平台差异和虚拟线程的栈归属，实跑 heap、Metaspace、native thread、OOMKilled 四种结局，并给出容器内存的参数表与核算方法。</description></item><item><title>《Java 并发编程·性能诊断与事故》14.1 availableProcessors 与 CPU 配额</title><link>https://plumephp.com/java-conc-eng-14-1-cpu-quota/</link><pubDate>Wed, 28 Oct 2026 22:42:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-14-1-cpu-quota/</guid><description>limits.cpu=2 的 Pod 里 JVM 到底看到几个核？本节用 cgroup v2 的 cpu.max 讲清 availableProcessors 的取值来源，在宿主与 colima 容器中实测 0.5/1/2/4/10/16 核下的 commonPool 并行度，并证明 -XX:ActiveProcessorCount 只能模拟核数、模拟不了 CFS 节流。</description></item><item><title>《Java 并发编程·性能诊断与事故》13.3 低延迟 GC 下的并发设计</title><link>https://plumephp.com/java-conc-eng-13-3-low-latency-gc/</link><pubDate>Wed, 28 Oct 2026 22:41:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-13-3-low-latency-gc/</guid><description>把 GC 从 G1 换成 ZGC 之后 p99 没降，问题往往不在收集器：先用同一负载对照 G1、ZGC 与分代 Shenandoah 的暂停与尾延迟，再给出低延迟下的四条并发设计约束——压分配速率、正确复用对象、避开大对象、处理伪共享，并附症状到参数动作的对照表。</description></item><item><title>《Java 并发编程·性能诊断与事故》13.2 并发标记与业务线程</title><link>https://plumephp.com/java-conc-eng-13-2-concurrent-mark/</link><pubDate>Wed, 28 Oct 2026 22:40:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-13-2-concurrent-mark/</guid><description>把 G1 的并发标记拆成写屏障、并发线程和停顿三段：用 SATB 预写屏障解释为什么改引用也要记账，用 ConcGCThreads=1 与 6 的对照日志证明标记线程只是把同一份 CPU 工作摊到更多核上，再用 JFR 的 jdk.GCPhaseConcurrent 聚合各阶段耗时，给出业务线程侧的观测口径。</description></item><item><title>《Java 并发编程·性能诊断与事故》13.1 分配速率、TLAB 与逃逸</title><link>https://plumephp.com/java-conc-eng-13-1-alloc-tlab/</link><pubDate>Wed, 28 Oct 2026 22:39:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-13-1-alloc-tlab/</guid><description>从一次「GC 次数高就该加大堆」的误判出发，用 ThreadMXBean.getThreadAllocatedBytes 与 JFR 分配事件实测 9.1 GB/s 的分配速率，拆解 TLAB 的 512 KB 填充与 184 字节/次的来源，再用三组逃逸分析对照说明标量替换为什么让分配计数归零，并纠正 HotSpot 并不做栈上分配。</description></item><item><title>《Java 并发编程·性能诊断与事故》12.3 告警阈值与容量水位</title><link>https://plumephp.com/java-conc-eng-12-3-alert-watermark/</link><pubDate>Wed, 28 Oct 2026 22:38:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-12-3-alert-watermark/</guid><description>把 150 个/秒的负载打进 4 线程、64 槽的有界池，按秒采集队列填充率、拒绝率、活跃占比与端到端 p99，用可运行的状态机验证持续时间窗口、连续次数与分级告警，并指出服务内 p99 只有 55 ms 而端到端已 792 ms 的指标盲区。</description></item><item><title>《Java 并发编程·性能诊断与事故》12.2 阻塞点与调用链结合</title><link>https://plumephp.com/java-conc-eng-12-2-blocking-trace/</link><pubDate>Wed, 28 Oct 2026 22:37:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-12-2-blocking-trace/</guid><description>以 200 ms 临界区把 4 个线程打成 BLOCKED 为场景，说明 ThreadMXBean 能给出状态、锁与持有者却给不出请求归属，ThreadLocal 又无法跨线程读取，于是用线程 ID 注册表把阻塞归因到 requestId，并给出结构化日志、采样策略与实测的扫描开销。</description></item><item><title>《Java 并发编程·性能诊断与事故》12.1 线程与池的指标口径</title><link>https://plumephp.com/java-conc-eng-12-1-pool-metrics/</link><pubDate>Wed, 28 Oct 2026 22:36:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-12-1-pool-metrics/</guid><description>从一次「active=8、queue=0 却仍被判定池满」的误判出发，逐条拆解 ThreadPoolExecutor 的 active、pool、queue、completed、taskCount 各自在数什么、哪些是快照哪些是估值，给出拒绝计数器的自埋写法，并用 120 个任务的实跑时序数据核对 getTaskCount 的分解式与跨 getter 的不一致。</description></item><item><title>《Java 并发编程·性能诊断与事故》11.3 锁粒度、热点与拆分</title><link>https://plumephp.com/java-conc-eng-11-3-hotspot-split/</link><pubDate>Wed, 28 Oct 2026 22:35:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-11-3-hotspot-split/</guid><description>热点到底是锁还是别的东西？本节先用 ThreadMXBean 与 JFR 定位锁竞争——实测 blockedCount 只认 synchronized、ReentrantLock 要去看 jdk.ThreadPark；再把单锁改成 16 路分片与 LongAdder，给出本机 8 线程下吞吐、p50、p99、p999 的真实对照，并说明 p99 为什么可能骗人、无锁化的边界在哪。</description></item><item><title>《Java 并发编程·性能诊断与事故》11.2 分布式锁的租约与续期</title><link>https://plumephp.com/java-conc-eng-11-2-distributed-lease/</link><pubDate>Wed, 28 Oct 2026 22:34:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-11-2-distributed-lease/</guid><description>分布式锁的本质是一段有期限的授权，看门狗只能降低概率，不能消除“租约过期但旧持有者仍在写”。本节用不依赖 Redis/ZooKeeper/etcd 的单机 ReentrantLock 加人造时钟复现旧持有者复活，实测 fencing token 把过期写入挡在存储侧，并给出时钟漂移、看门狗失效与续期失败的边界。</description></item><item><title>《Java 并发编程·性能诊断与事故》11.1 数据库行锁与 Java 锁的叠加</title><link>https://plumephp.com/java-conc-eng-11-1-db-lock-overlap/</link><pubDate>Wed, 28 Oct 2026 22:33:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-11-1-db-lock-overlap/</guid><description>Java 侧锁顺序正确，事务里的 SQL 顺序却反了；或者 Java 锁与连接池交叉等待，JVM 死锁检测完全看不见。本节用纯 JDK 的行锁替身与连接池复现两类叠加死锁，给出真实线程转储判据、未在本机验证的 pg_locks 与 innodb status 读法，以及三者的耦合边界。</description></item><item><title>《Java 并发编程·性能诊断与事故》10.3 线程泄漏与上下文类加载器</title><link>https://plumephp.com/java-conc-eng-10-3-thread-leak-tccl/</link><pubDate>Wed, 28 Oct 2026 22:32:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-10-3-thread-leak-tccl/</guid><description>线程池不 shutdown、ThreadLocal 滞留大对象、线程上下文类加载器钉住插件加载器，是三种不同的泄漏。本节用 100 个未关闭的池复现 200 个常驻 worker，用 200 次 URLClassLoader 热部署复现 200 个无法回收的加载器，并用 jcmd GC.class_histogram 与 jmap -histo:live 做前后对照。</description></item><item><title>《Java 并发编程·性能诊断与事故》10.2 拒绝策略引发的雪崩</title><link>https://plumephp.com/java-conc-eng-10-2-reject-avalanche/</link><pubDate>Wed, 28 Oct 2026 22:31:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-10-2-reject-avalanche/</guid><description>重试不会创造容量，只会把拒绝率换算成更高的到达率。本节在 8 线程、64 队列、2000/s 到达的构造场景里实测：3 次重试把尝试数放大 2.53 倍，却只多完成 0.9% 的请求；同时对比 CallerRunsPolicy 占用提交线程 9 ms、DiscardPolicy 静默丢掉 48% 的任务，并给出拒绝不重试的落地写法。</description></item><item><title>《Java 并发编程·性能诊断与事故》10.1 队列堆积与 OOM</title><link>https://plumephp.com/java-conc-eng-10-1-queue-oom/</link><pubDate>Wed, 28 Oct 2026 22:30:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-10-1-queue-oom/</guid><description>无界队列不会避免过载，只会把过载从拒绝变成堆增长。本节用 2 个 worker、1000/s 到达、64 KB 消息体在 -Xmx256m 下真实跑出 OOM，给出堆积速率与堆增长的算式，并用 jcmd GC.class_histogram 定位到占着约 145 MiB 的 byte[]，最后给出有界队列与水位拒绝的落地写法。</description></item><item><title>《Java 并发编程·性能诊断与事故》9.3 从事故到 happens-before 归因</title><link>https://plumephp.com/java-conc-eng-09-3-hb-attribution/</link><pubDate>Wed, 28 Oct 2026 22:29:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-09-3-hb-attribution/</guid><description>把过期读与半成品对象两起构造事故收进同一张归因表，给出从现象、违规的 happens-before 规则、三级证据到修复验证的完整链路，附可复用的自旋线程检测器与回归测试，并如实记录回归测试 2200 万次读取 0 命中的能力边界与本机复现数据。</description></item><item><title>《Java 并发编程·性能诊断与事故》9.2 安全发布失败的对象</title><link>https://plumephp.com/java-conc-eng-09-2-unsafe-publication/</link><pubDate>Wed, 28 Oct 2026 22:28:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-09-2-unsafe-publication/</guid><description>构造构造器注册回调导致的 this 逸出，用逐次计数的命中统计复现半成品对象；再用四个 JCStress 用例分别测量非 final 字段、final 字段、this 逸出与 volatile 发布的命中率，给出本机真实样本数、两轮频率与修复写法。</description></item><item><title>《Java 并发编程·性能诊断与事故》9.1 过期读与无限循环</title><link>https://plumephp.com/java-conc-eng-09-1-stale-read/</link><pubDate>Wed, 28 Oct 2026 22:27:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-09-1-stale-read/</guid><description>从停不掉的停机标志出发，构造非 volatile 标志导致的无限循环，用线程转储、JFR 采样与 PrintCompilation 定位到 C2 把字段读提升到循环外，并在本机用 30 次独立 JVM 运行逐档对照 Xint、C1、C2 与 volatile 修复的复现率。</description></item><item><title>《Java 并发编程·性能诊断与事故》8.3 竞态复现、最小化与回归</title><link>https://plumephp.com/java-conc-eng-08-3-race-minimize/</link><pubDate>Wed, 28 Oct 2026 22:26:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-08-3-race-minimize/</guid><description>从构造的负库存现象出发，给出把 1024 并发缩到 2 个 actor、库存缩到 1 的四步最小化路径；用本机两轮 JCStress 命中率与 StressSeed 说明概率复现的边界，并给出可阻断 CI 的回归测试、Maven profile 与 nightly 成本预算。</description></item><item><title>《Java 并发编程·性能诊断与事故》8.2 Lincheck 的线性一致性检查</title><link>https://plumephp.com/java-conc-eng-08-2-lincheck/</link><pubDate>Wed, 28 Oct 2026 22:25:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-08-2-lincheck/</guid><description>从库存扣减的读改写解释线性化点，用 Lincheck 的模型检验系统地枚举线程交错；给出 Kotlin + Maven 的最小工程、场景生成参数与失败报告读法，并如实标注本机未安装 Kotlin 运行时、2.44 在 Maven Central 不存在（最新 2.39），全部结果未在本机执行。</description></item><item><title>《Java 并发编程·性能诊断与事故》8.1 JCStress 的测试模型</title><link>https://plumephp.com/java-conc-eng-08-1-jcstress-model/</link><pubDate>Wed, 28 Oct 2026 22:24:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-08-1-jcstress-model/</guid><description>从库存扣减的读改写竞态出发，拆解 JCStress 0.16 的 @JCStressTest、@State、@Actor、@Arbiter、@Outcome 与 Expect 分工，给出自定义结果类型的完整示例；并在本机 JDK 25 复现 proc=full 缺失导致的 TestList 空指针，再实跑两轮记录 FORBIDDEN 命中率。</description></item><item><title>《Java 并发编程·性能诊断与事故》7.3 混合栈的边界与调试</title><link>https://plumephp.com/java-conc-eng-07-3-mixed-stack/</link><pubDate>Wed, 28 Oct 2026 22:23:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-07-3-mixed-stack/</guid><description>事件循环、虚拟线程、平台线程池同时存在时，事故往往发生在边界上：阻塞调用混进循环、上下文在换线程时丢失、jstack 看不到未挂载的虚拟线程。本节用本机实测标出三种边界与 trace 断点，并给出线程转储、JFR 事件与边界策略的具体判读方法。</description></item><item><title>《Java 并发编程·性能诊断与事故》7.2 两种模型的取舍矩阵</title><link>https://plumephp.com/java-conc-eng-07-2-tradeoff-matrix/</link><pubDate>Wed, 28 Oct 2026 22:22:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-07-2-tradeoff-matrix/</guid><description>把事件循环与虚拟线程放在团队熟悉度、调试难度、生态、阻塞调用、尾延迟、内存、可观测性七个维度上逐条比较，每维给出哪边更好及其原因；用同一批 600 个混合任务在本机四次量出 P99 差距（5.2 秒对 0.26 秒），并给出一张填好权重就能出结论的选型表与可运行的打分程序。</description></item><item><title>《Java 并发编程·性能诊断与事故》7.1 Reactor 的线程模型回顾</title><link>https://plumephp.com/java-conc-eng-07-1-reactor-model/</link><pubDate>Wed, 28 Oct 2026 22:21:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-07-1-reactor-model/</guid><description>用一个 60 行以内的 JDK Selector 事件循环讲清 Reactor 的两个数据结构、非阻塞前提与背压本质，并用本机实测展示一次阻塞调用如何把 3 个并发请求的往返延迟从 5 ms 拉到约 50 ms，以及停止读取后 TCP 窗口如何在 2.9 MB 处关死。</description></item><item><title>《Java 并发编程·性能诊断与事故》6.3 连接池、ThreadLocal 与 MDC</title><link>https://plumephp.com/java-conc-eng-06-3-pool-mdc-adapt/</link><pubDate>Wed, 28 Oct 2026 22:20:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-06-3-pool-mdc-adapt/</guid><description>虚拟线程放开了线程数，却把瓶颈推到连接池、ThreadLocal 与日志上下文上。本节实测 5000 个虚拟线程撞上 8 个连接时 p99 涨到 16.7 秒，量出每线程一份 ThreadLocal 的堆代价，并用可运行代码演示 MDC 串号与三种修法。</description></item><item><title>《Java 并发编程·性能诊断与事故》6.2 pinning 的诊断与消除</title><link>https://plumephp.com/java-conc-eng-06-2-pinning-diagnosis/</link><pubDate>Wed, 28 Oct 2026 22:19:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-06-2-pinning-diagnosis/</guid><description>JDK 24 的 JEP 491 让 synchronized 不再 pin 载体线程，旧教材的清单已经过期。本节在本机把十种阻塞写法逐个实测，给出类初始化、Object.wait、native 帧三类仍然会 pin 的场景与 JFR 事件原文，并说明为什么阈值必须降到 0ms。</description></item><item><title>《Java 并发编程·性能诊断与事故》6.1 十万/百万虚拟线程实测</title><link>https://plumephp.com/java-conc-eng-06-1-million-threads/</link><pubDate>Wed, 28 Oct 2026 22:18:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-06-1-million-threads/</guid><description>十万和一百万虚拟线程在本机实跑：三档创建耗时 49/179/597 ms，堆占用约 1 KB 一条，载体线程始终 10 个。文章给出完整数据、781 MB 的 jcmd 转储实测，并解释 ThreadMXBean 与 Thread.print 为何完全看不见虚拟线程。</description></item><item><title>《Java 并发编程·性能诊断与事故》5.3 队列长度、拒绝率与降级</title><link>https://plumephp.com/java-conc-eng-05-3-queue-reject-degrade/</link><pubDate>Wed, 28 Oct 2026 22:17:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-05-3-queue-reject-degrade/</guid><description>队列变长并不会降低拒绝率，只会把拒绝推迟并把尾延迟抬高。本节用开环定速压测跑出 4 与 16 两种池大小、0/16/64/256 四种队列长度的拒绝率与 P99，对照 AbortPolicy、CallerRunsPolicy、DiscardPolicy 在过载下的真实行为，并给出一套带拒绝计数与降级返回值的入口实现。</description></item><item><title>《Java 并发编程·性能诊断与事故》5.2 CPU 密集与 IO 密集的池大小</title><link>https://plumephp.com/java-conc-eng-05-2-pool-sizing/</link><pubDate>Wed, 28 Oct 2026 22:16:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-05-2-pool-sizing/</guid><description>同样是「加线程」，CPU 密集任务在 10 线程后吞吐就不再上涨，IO 密集任务到 48 线程仍在涨。本节讲清 N+1 与 N×(1+W/C) 的来历，用 ThreadMXBean 的线程 CPU 时间实测 W/C，在本机十核上跑出两条完整的池大小曲线，并说明虚拟线程时代公式的落点如何转移到连接池。</description></item><item><title>《Java 并发编程·性能诊断与事故》5.1 Little's law 在池化中的应用</title><link>https://plumephp.com/java-conc-eng-05-1-littles-law/</link><pubDate>Wed, 28 Oct 2026 22:15:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-05-1-littles-law/</guid><description>线程池该开多大，不该靠手感。本节从 L = λW 的计数推导讲起，用一次开环定速到达的实验校核「系统内请求数」与「吞吐乘延迟」是否相等，给出算所需并发、反推吞吐上限、判断余量三种用法，以及一张从假设到结论的容量估算表，并说明稳态、有界、不区分分位这三个前提。</description></item><item><title>《Java 并发编程·性能诊断与事故》4.3 锁顺序规范与超时兜底</title><link>https://plumephp.com/java-conc-eng-04-3-lock-ordering/</link><pubDate>Wed, 28 Oct 2026 22:14:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-04-3-lock-ordering/</guid><description>把锁顺序规范落成可执行的规则：按业务 ID 排序、按类型分层、粗粒度到细粒度单向升级，并给出 tryLock(timeout) 兜底的转账代码与真实代价——采样 60 份转储发现 10 份存在反向边，固定顺序后 20 份降为 0，附可直接运行的检测脚本。</description></item><item><title>《Java 并发编程·性能诊断与事故》4.2 活锁、饥饿与优先级反转</title><link>https://plumephp.com/java-conc-eng-04-2-livelock-starvation/</link><pubDate>Wed, 28 Oct 2026 22:13:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-04-2-livelock-starvation/</guid><description>用可运行的重试碰撞实验复现活锁，给出 2 秒内 31 万到 38 万个回合、成功 0 次的真实计数，对照非公平锁与公平锁下写者的等待分位与吞吐差距，实测 macOS 上 Thread.setPriority 的 os_prio 不变、迭代数无稳定差异，最后给出带抖动的退避与锁选择建议。</description></item><item><title>《Java 并发编程·性能诊断与事故》4.1 死锁的四个必要条件与检测</title><link>https://plumephp.com/java-conc-eng-04-1-deadlock-detect/</link><pubDate>Wed, 28 Oct 2026 22:12:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-04-1-deadlock-detect/</guid><description>把死锁的四个必要条件逐条映射到 ReentrantLock 转账代码的具体行，用一份真实的 jcmd Thread.print -l 转储确认 JVM 报出的 ownable synchronizer 环，并给出基于 ThreadMXBean.findDeadlockedThreads() 的看门狗代码、真实输出与连续两次确认的防抖策略。</description></item><item><title>《Java 并发编程·性能诊断与事故》3.3 线程转储的读法</title><link>https://plumephp.com/java-conc-eng-03-3-thread-dump/</link><pubDate>Wed, 28 Oct 2026 22:11:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-03-3-thread-dump/</guid><description>用一份同时包含 BLOCKED、WAITING (parking) 与 Java 级死锁的真实线程转储，讲清 jcmd Thread.print -l 与 jstack -l、- waiting to lock/- locked/parking to wait for 的配对方法，如何从地址找到锁持有者，以及 Found one Java-level deadlock 段的读法与修复后的验证。</description></item><item><title>《Java 并发编程·性能诊断与事故》3.2 async-profiler 的锁与分配火焰图</title><link>https://plumephp.com/java-conc-eng-03-2-async-profiler/</link><pubDate>Wed, 28 Oct 2026 22:10:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-03-2-async-profiler/</guid><description>async-profiler 本机未安装，本节只给 macOS 与 release 包的安装方式、-e lock/-e alloc/-d/-o 命令和火焰图读法，并明确不贴它的输出；随后用 JFR 的 jdk.ObjectAllocationSample 实跑一次分配采样，给出 allocation-by-class/site 与 weight 字段的真实数据，形成可复现的替代证据。</description></item><item><title>《Java 并发编程·性能诊断与事故》3.1 JFR 的 Monitor 事件</title><link>https://plumephp.com/java-conc-eng-03-1-jfr-monitor/</link><pubDate>Wed, 28 Oct 2026 22:09:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-03-1-jfr-monitor/</guid><description>从 4 线程抢同一把监视器锁的实跑出发，说明 jdk.JavaMonitorEnter、jdk.JavaMonitorWait 与 jdk.ThreadPark 各自记录什么，profile.jfc 的 10 ms 默认阈值如何过滤掉短竞争，并给出 jfr summary、jfr view 与 jfr print 的真实输出，最后用 LongAdder 改造验证竞争消失。</description></item><item><title>《Java 并发编程·性能诊断与事故》2.3 从微基准到系统压测</title><link>https://plumephp.com/java-conc-eng-02-3-bench-to-loadtest/</link><pubDate>Wed, 28 Oct 2026 22:08:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-02-3-bench-to-loadtest/</guid><description>把同一个库存扣减分别放进 JMH 与闭环压测：微基准 2848 万 ops/s、零分配，系统压测只有 202 到 1703 rps，同一把锁的位置改动让 P99 差两个数量级。逐项拆解同步、GC、网络、队列与限流带来的差距，并给出可复核的压测报告模板与诚实的数据边界。</description></item><item><title>《Java 并发编程·性能诊断与事故》2.2 微基准的陷阱</title><link>https://plumephp.com/java-conc-eng-02-2-microbenchmark-traps/</link><pubDate>Wed, 28 Oct 2026 22:07:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-02-2-microbenchmark-traps/</guid><description>用本机 JMH 1.37 与 javap 实测拆开五个微基准陷阱：死代码消除、常量折叠、循环展开、预热不足、伪共享未隔离；每个都给错误代码、正确代码与本机输出，逐条标注哪些现象稳定复现、哪些只能按 JIT 行为推导，最后给出可在 CI 里运行的基准评审脚本。</description></item><item><title>《Java 并发编程·性能诊断与事故》2.1 JMH 的正确姿势</title><link>https://plumephp.com/java-conc-eng-02-1-jmh/</link><pubDate>Wed, 28 Oct 2026 22:06:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-02-1-jmh/</guid><description>从 libraryd-conc 的库存扣减基准出发，给出 JMH 1.37 的完整 pom、基准类与两种跑法，用本机实测解释 @State 三种作用域、@Fork 隔离、@BenchmarkMode 与 ±(99.9%) 误差列的读法，并说明置信区间下界为 0 时为什么不能下结论。</description></item><item><title>《Java 并发编程·性能诊断与事故》1.3 吞吐、时延与并发的三角</title><link>https://plumephp.com/java-conc-eng-01-3-throughput-latency/</link><pubDate>Wed, 28 Oct 2026 22:05:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-01-3-throughput-latency/</guid><description>吞吐涨不动而 p99 恶化，是最容易误诊的组合。本节讲清平均与分位各自的说谎方式，用 Little 定律与排队模型解释延迟为何随并发线性上涨，并在 1/4/16/64/256 五档并发下实测吞吐与 p50/p99/p999，最后给出尾延迟放大与定容口径。</description></item><item><title>《Java 并发编程·性能诊断与事故》1.2 上下文切换、调度延迟与 CPU 配额</title><link>https://plumephp.com/java-conc-eng-01-2-context-switch/</link><pubDate>Wed, 28 Oct 2026 22:04:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-01-2-context-switch/</guid><description>CPU 没跑满、吞吐却上不去，先分清是锁排队还是线程太多。本节对照 vmstat 与 pidstat 的口径，给出 macOS 上真实可用的替代命令与实跑输出，用线程数阶梯测出吞吐与每操作 CPU 成本的变化，并说明容器 CPU 配额如何改变可用核数。</description></item><item><title>《Java 并发编程·性能诊断与事故》1.1 Amdahl 与 USL：扩展性的天花板</title><link>https://plumephp.com/java-conc-eng-01-1-amdahl-usl/</link><pubDate>Wed, 28 Oct 2026 22:03:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-01-1-amdahl-usl/</guid><description>并发加到某个数量后吞吐不再上涨，是串行段还是争用？本节从 Amdahl 的串行比例推到 USL 的争用项与一致性项，用两个观测点解出 σ 与 κ，给出一张按公式推导的容量估算表，算出峰值位置与每核边际收益，并说明外推到多大规模型号就失效、什么时候该改代码而不是加机器。</description></item><item><title>《Java 并发编程·性能诊断与事故》目录与学习路径</title><link>https://plumephp.com/java-conc-eng-toc/</link><pubDate>Wed, 28 Oct 2026 22:02:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-toc/</guid><description>《Java 并发编程·性能诊断与事故》全书导航：说明本卷在三卷本中的位置与五部分划分，给出顺序通读、症状驱动、值班查表三条路径，按部分列出 15 章 45 节的完整索引、每章三节的模型—诊断—处置递进、章间依赖与全书实验清单，并附一张从现象直接跳到章节的对照表。</description></item><item><title>《Java 并发编程·性能诊断与事故》前言：实验环境、工具与数据口径</title><link>https://plumephp.com/java-conc-eng-preface/</link><pubDate>Wed, 28 Oct 2026 22:01:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-preface/</guid><description>《Java 并发编程·性能诊断与事故》前言：钉死本机的 JDK、Maven 与工具版本，交代 load average 常年 70–170 对计时的影响，给出 JMH、JCStress、JFR 的可用命令与实测事件名，说明 async-profiler 未安装、Lincheck 未执行，并定义本卷四类数据标注与五个指标口径。</description></item><item><title>《Java 并发编程·性能诊断与事故》序：规则在压力下才见真章</title><link>https://plumephp.com/java-conc-eng-foreword/</link><pubDate>Wed, 28 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-conc-eng-foreword/</guid><description>《Java 并发编程·性能诊断与事故》开篇：从一个 CPU 只有三成、GC 正常、日志无异常却 P99 涨了三十倍的构造场景出发，分清正确性、性能、容量三类失效，给出从症状到验证的五步诊断闭环，交代三卷边界与本卷构造事故的口径，并说明为什么本书的数字只讲结构性差异。</description></item></channel></rss>