JJava 知识库
JAVA INTERVIEW

高频面试题

Java多线程基础约 2 分钟

线上接口卡住但 CPU 不高,线程快照里大量 WAITING 和 BLOCKED,你会怎么分析?

参考回答约 2 分钟 · 口语表达
我的判断

CPU 不高但请求卡住,多半不是算不动,而是在等锁、条件、连接或下游;线程快照要结合锁拥有者和请求链路看。

我会连续抓三份线程快照,间隔几秒,先按线程状态和相同堆栈聚类。大量 BLOCKED 时找到它们等待的 monitor,再沿 locked 信息定位持锁线程;大量 WAITING/TIMED_WAITING 则区分正常的线程池空闲、CountDownLatch 未完成、连接池取连接和 RPC Future 等待。

如果几百个请求都卡在拿数据库连接,根因可能是少数慢 SQL 或连接泄漏,不是线程问题;如果都等同一把业务锁,就看持锁线程是不是在锁内做远程调用。线程名、traceId、APM span、连接池和数据库活动会放在同一时间线上。

止损会根据阻塞点处理:限流新请求、降级非核心下游、终止明确失控的查询,必要时摘除并重启问题实例。保留现场后再修复锁范围、超时和资源池边界。

单张线程快照只能说明一个瞬间。连续快照里同一批线程和同一持锁者都不动,才更像真正卡死。