Java 报错分析提示词(异常堆栈定位、OutOfMemoryError 分类排查、线程 dump 看死锁与线程池打满)

Java 服务报了一长串异常堆栈看不懂、出现 OutOfMemoryError、接口全部卡住疑似死锁或线程池耗尽时用:把堆栈、GC 日志或线程 dump 贴给 AI,它找出真正的根因所在行、判断 OOM 属于哪一类,并告诉你下一步该抓什么数据、怎么修。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
你是一名排查过大量 Java 线上问题的工程师,熟悉 JVM 内存结构、GC 和线程模型。请帮我分析下面的问题。

- 问题类型:[问题类型](可选:异常堆栈/内存溢出/接口卡死)
- JDK 版本与框架:[JDK 与框架](例:JDK 17 + Spring Boot 3)
- JVM 启动参数:[JVM 参数](例:-Xmx2g,没有就写不知道)
- 部署环境:[部署环境](例:容器内存限制 3G)
- 现象与发生时间:[现象]
- 材料(异常堆栈、GC 日志片段、线程 dump,原样粘贴):
  [粘贴材料]
- 相关代码(如果已经定位到某个类):
  [相关代码]

分析方法:
1. 异常堆栈:
   - 找到最底层的 Caused by,这通常才是根因;
   - 跳过框架内部的调用帧,找出第一个属于我们自己代码的帧,指出具体的类、方法和行号;
   - 解释异常的直接原因(比如空指针是哪个变量为空),以及可能的上游原因。
2. 内存溢出:先根据错误信息判断类型——堆内存不足、元空间不足、无法创建新的本地线程、直接内存不足、GC 开销超限、容器限制导致进程被系统终止(这种情况 JVM 可能来不及打印错误)——不同类型的排查方向完全不同。然后说明需要的数据(堆转储、GC 日志)、启动参数应该怎么加,以及分析堆转储时看什么。
3. 线程 dump:统计线程状态分布;找出大量线程阻塞在同一处的位置(例如都在等待数据库连接池、都在等同一把锁);检测死锁(dump 中会明确标出);判断是线程池满了还是下游变慢。
4. 给出结论:最可能的根因(按可能性排序)、验证方法、修复方案、短期止血办法。

材料不足以下结论时,告诉我还需要哪些数据、用什么命令获取。

高亮处换成你自己的内容:[问题类型]、[JDK 与框架]、[JVM 参数]、[部署环境]、[现象]、[粘贴材料]、[相关代码]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[粘贴材料] 不要只截取最上面几行。异常堆栈要包含所有 Caused by 段;线程 dump 最好完整贴上,或者至少包括所有业务线程。[部署环境] 中的容器内存限制很重要,堆设置得太接近容器限制时,进程会被直接终止,日志里看不到 OOM。

常见坑:

  • 只看堆栈最上面一行,那往往是框架包装后抛出的异常,真正的原因在最下面的 Caused by。
  • 一遇到 OOM 就调大堆内存,如果是内存泄漏,只是推迟了崩溃时间;如果是「无法创建本地线程」,调大堆反而更糟。
  • 线上卡住时只重启不留证据。重启前先抓一次线程 dump(间隔几秒抓两到三次),之后才有机会找到原因。

追问技巧:拿到堆转储的分析结果(如占用最多的对象、支配树)后贴回去,问「这些对象被谁持有,对应哪段代码」。

示例输出

示例,仅供参考(线程 dump,接口全部超时)

线程状态:200 个 Tomcat 工作线程中,186 个处于 TIMED_WAITING,堆栈均停在:

at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:...)
at ...OrderRepository.findByUser(OrderRepository.java:42)

判断:线程池满的直接原因是数据库连接池耗尽(连接池大小为 10,所有线程都在等连接),而不是死锁(dump 中没有死锁提示)。

可能的根因(按可能性):

  1. 有慢查询长时间占用连接——查看同时段数据库的慢查询日志;
  2. 连接泄漏——代码中手动获取连接后未在异常路径关闭,开启连接池的泄漏检测验证;
  3. 下游流量突增——对比请求量监控。

止血:临时扩容实例分摊流量;定位到慢查询后先加索引或限流该接口。不建议直接把连接池调得很大,会把压力转移给数据库。

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~