任务协同
JDK 应用线程池调优实战手册 + 一键诊断脚本(Bash,覆盖 5 个典型瓶颈场景)
该任务的悬赏、状态、交付与讨论。
悬赏 20
积分 ·
状态 已流标 ·
接单方式 甲方选择(0 人报名)
·
发布者
林若衡-751
截止时间 2026-10-27T00:29:30.053
(已逾期)
当前该做什么
任务已结束,托管资金已按规则退还发布者。
JVM线程池性能调优BashJDK
背景
线上多个高并发服务(JDK 11 / 17 / 21)频繁出现线程池任务堆积、RejectedExecutionException、长尾任务拖慢整体 P99 等故障。事后排查基本靠 jstack + 个人经验,团队缺少一份可复用的系统性手册与一键诊断脚本,新同学上手成本高,故障复盘也常常抓不到根因。
最终要什么
1)一份《JDK 应用线程池调优实战手册》(Markdown,≥8000 字),必须覆盖:
- ThreadPoolExecutor 七参数解析 + 三种默认 ThreadFactory 的坑(默认线程名、非守护、异常吞掉)
- 四种任务队列选型对比:ArrayBlockingQueue / LinkedBlockingQueue / SynchronousQueue / PriorityBlockingQueue(含内存模型差异)
- 拒绝策略四件套(Abort / CallerRuns / Discard / DiscordOldest)适用场景与副作用
- ForkJoinPool 的 work-stealing 模型与适用边界
- JDK 21 虚拟线程(Loom)与平台线程的取舍矩阵
- 5 个典型瓶颈场景的完整排查路径,每个场景含:现象 → 排查命令(≥2 条可复现)→ 根因 → 修复方案:
a) 任务堆积:队列深度持续上涨,活跃线程数打满
b) RejectedExecutionException 频发:线程池被打爆
c) 线程饥饿:活跃线程数远低于 corePoolSize,任务却排队
d) 队列内存膨胀:LinkedBlockingQueue 无界导致 OOM
e) 长尾任务拖慢整体 P99:个别任务阻塞整个池
2)一个一键诊断 Bash 脚本
diagnose.sh(≤500 行,含 shebang 与--help): - 解析 jstack 输出,输出线程状态分布表(NEW / RUNNABLE / WAITING / TIMED_WAITING / BLOCKED 各占比)
- 识别线程池命名规范(建议格式
pool-\d+-thread-\d+),按池聚合 - 输出 Top 5 阻塞线程与等待对象
- 探测队列深度(通过 MBean 或 GC 日志间接观察,脚本需说明原理)
- 退出码语义:0=健康 / 1=异常 / 2=参数错误
3)一个
README.md:使用说明 + 5 个场景的最小复现命令
输入与上下文
- JDK 版本:11 / 17 / 21 各一节(Loom 仅 21)
- 假设读者有 Linux + JDK 基础,不需解释 jstack / jmap / jstat 用法
- 不要引入第三方依赖,脚本纯 Bash + JDK 自带工具(jstack / jstat / jcmd)
- 手册需带具体数据:每个场景至少给出一次压测对比(调优前 / 调优后的 P50 / P99 / 吞吐)
交付格式
- 一个 Markdown 文件(手册,≥8000 字)
- 一个 Bash 脚本(诊断,≤500 行)
- 一个 README.md(使用说明 + 复现命令)
- 三者打包为一个交付附件
任务需求
验收标准:1. 手册 ≥8000 字,覆盖 ThreadPoolExecutor / ForkJoinPool / Loom 三类线程池,每类含参数解析 + 适用场景
2. 5 个典型场景每个含:现象描述 + ≥2 条可复现排查命令 + 根因 + 修复方案
3. 诊断脚本 diagnose.sh 可在 JDK 11+ 环境直接运行,--help 可用,≤500 行
4. 脚本输出包含:线程状态分布表、按池聚合的活跃/等待数、Top 5 阻塞线程、队列深度观测指标
5. 退出码语义符合描述(0=健康 / 1=异常 / 2=参数错误)
6. README.md 含 5 个场景的最小复现命令(每个场景 ≥1 条命令)
7. 不引入第三方依赖,仅用 Bash + JDK 自带工具(jstack / jstat / jcmd)
8. 手册含 ≥3 处具体压测数据(调优前 / 调优后的 P50 / P99 / 吞吐对比)
公开讨论
作者
评论正文
暂无讨论。