实用指南:JVM栈溢出时如何dump栈信息?

news/2025/10/13 19:30:14/文章来源:https://www.cnblogs.com/yxysuanfa/p/19139196

⚙️ 一、自动捕获栈信息

  1. JVM参数配置
  • 启用栈跟踪日志:
    在启动参数中添加 -XX:+PrintGCDetails -XX:+ShowCodeDetailsInExceptionMessages,使栈溢出时输出更详细的调用链信息。
    示例:
    java -XX:+PrintGCDetails -XX:+ShowCodeDetailsInExceptionMessages YourApp
  • 自定义错误处理(代码级):
    捕获 StackOverflowError 并记录完整堆栈:
    try {
    recursiveMethod();
    } catch (StackOverflowError e) {
    e.printStackTrace();  // 输出到控制台
    // 或写入文件
    try (FileWriter writer = new FileWriter("stack_dump.txt")) {
    e.printStackTrace(new PrintWriter(writer));
    }
    }

二、手动触发栈信息转储

  1. 使用 jstack 生成线程快照
  • 获取进程ID:
    jps -l  查看Java进程PID
  • 生成线程转储:
    jstack  > thread_dump.txt  输出到文件
    关键选项:
    • -l:显示锁信息(如死锁线程)
    • -m:包含本地方法栈(Native方法)
  1. 通过 kill 命令触发
  • 向JVM发送 SIGQUIT 信号(Linux/macOS):
    kill -3   生成线程快照到控制台
    输出示例:
    Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):
    "main" #1 prio=5 os_prio=0 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)...

三、分析栈信息

  1. 关键字段解读
    | 字段 | 含义 |
    |------------------------|--------------------------------------------------------------------------|
    | 线程名称 | 如 mainTimer-0,标识问题线程 |
    | 状态 | RUNNABLE(执行中)、WAITING(等待)、BLOCKED(阻塞) |
    | 调用栈 | 从下向上追溯方法调用链,重复方法提示递归 |
    | 锁信息 | locked(持有锁)、waiting on(等待锁) |
  2. 典型问题定位
  • 无限递归:
    调用栈中重复出现同一方法(如 recursiveMethod())。
    示例:
    at com.example.RecursiveDemo.recursiveMethod(RecursiveDemo.java:10)
    at com.example.RecursiveDemo.recursiveMethod(RecursiveDemo.java:10)
    ...
  • 深层方法链:
    调用栈层级过深(如 >1000帧),且无递归重复。

️ 四、推荐工具

工具功能适用场景
jstack生成线程快照,分析调用链和锁状态命令行环境、快速诊断
VisualVM可视化查看线程状态、调用栈及CPU占用本地开发、调试
JConsole实时监控线程状态和内存使用生产环境远程监控
Arthas动态追踪方法调用链,支持热部署分析在线诊断复杂业务逻辑

五、操作流程总结

  1. 触发栈溢出时:
    • 检查控制台输出的默认栈跟踪(若未屏蔽)。
    • 执行 jstack > thread_dump.txtkill -3 手动生成快照。
  2. 分析快照:
    • 使用 grep 过滤问题线程:
      grep -A 20 "java.lang.Thread.State: RUNNABLE" thread_dump.txt
    • 在VisualVM中加载快照,查看线程调用树。
  3. 定位代码:
    • 根据重复方法名或深层调用链,直接跳转到源码行(如 RecursiveDemo.java:10)。

⚠️ 注意事项

  • 生产环境慎用:
    jstackkill -3 可能导致短暂停顿(Stop-The-World),建议在低峰期操作。
  • 区分堆与栈dump:
    栈信息通过线程转储获取,堆信息需用 jmap 生成(如 jmap -dump:format=b,file=heap.hprof)。
  • 根本解决:
    dump文件仅辅助定位,需结合代码优化(如递归转迭代)彻底修复。

终极建议:栈溢出多由代码逻辑导致,优先通过单元测试覆盖递归边界条件,再依赖dump分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232323 2025-2026-1《网络与系统攻防技术》实验一实验报告

一.实验内容 本次实验针对 Linux 平台可执行文件 pwn1,围绕缓冲区溢出(BOF)漏洞挖掘与 shellcode 注入技术展开,核心目标是通过三种路径篡改程序执行流程:1. 手动修改机器指令,将 main 函数调用的 foo 函数替换…

树莓派4B安装WiringPi使用gpio命令

1.使用Git下载WiringPi C 源码 git clone https://github.com/WiringPi/WiringPi.git2.编译源码 安装 ./build卸载 ./build uninstall 3.执行命令gpio -v,查看WiringPi版本4.使用gpio readall查看gpio状态5.使用pinou…

1分钟Get宠物神兽壁纸我家猫被问疯了!

谁懂啊!自从换了这张壁纸,每个朋友都来问我怎么做的! 今天就公开这个“朋友圈装B指南”! 手把手教你把你家主子变成《山海经》神兽!超简单!【准备】 1️⃣ 下载“豆包”APP 2️⃣ 选一张主子的靓照📸 【施法步…

Zabbix 6.0+ 运用官方模板监控 Redis 数据库的完整安装指南

Zabbix 6.0+ 运用官方模板监控 Redis 数据库的完整安装指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

【图论】Floyd算法简析

在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可…

perl-Test-Simple-1.302195-5.fc39.noarch.rpm 怎么安装?Fedora 39 安装步骤讲解

perl-Test-Simple-1.302195-5.fc39.noarch.rpm 怎么安装?Fedora 39 安装步骤讲解​perl-Test-Simple-1.302195-5.fc39.noarch.rpm​ 是一个为 ​Fedora 39​ 系统准备的 ​RPM 软件包,它里面包含的是 Perl 编程语言的…

Python的typing模块:类型提示 (Type Hinting) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MyEclipse 2017 激活教程

https://www.rjctx.com/6045.htmlEclipse有很多插件,用来完善它的各种编辑功能,你可以完全不用插件,但所有的代码都得你自己写。所以用eclipse就是用它的各种插件生成代码然后调用jre编译。jre就和eclipse没关系了。…

插入 dp

简介 一般问题为:考虑一个元素插入在其它元素的前 / 后。 状态设计一般为 \(dp_{i, j}\) 表示前 \(i\) 为且第 \(i\) 位排名为 \(j\) 的方案数。 例题 AT_dp_t Permutation 插入 dp 板子。 AT_abc209_f [ABC209F] Def…

麒麟系统中修改 WPS 默认新建文件格式的方法 - 实践

麒麟系统中修改 WPS 默认新建文件格式的方法 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

05_Mysql与图片的存储

Mysql5.7的安装、配置、卸载 安装Mysql5.7 由于我的虚拟机版本为Ubuntu22.04, 不能通过apt-get安装,只能通过wget下载5.7资源包,编译安装。 参考链接:https://www.cnblogs.com/DingyLand/p/17466734.html # 更新apt…

【Linux】权限 - 实践

【Linux】权限 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

斯坦福ACE框架:让AI自己学会写prompt,性能提升17%成本降87%

斯坦福和SambaNova AI最近联合发了一篇论文,Agentic Context Engineering (ACE)。核心思路:不碰模型参数,专注优化输入的上下文。让模型自己生成prompt,反思效果,再迭代改进。 可以把这个过程想象成模型在维护一本…

【左扬精讲】SRE 别慌!我用 服务器监控指标 讲 KNN 分类算法,从相似度计算到异常识别,都是咱运维人能懂的话(含代码)

【左扬精讲】SRE 别慌!我用 "服务器监控指标" 讲 KNN 分类算法,从相似度计算到异常识别,都是咱运维人能懂的话(含代码) 一、从 SRE 日常工作理解 KNN 的核心逻辑作为 SRE,你是否经常遇到这样的场景:​…

【C++】AVL详解 - 教程

【C++】AVL详解 - 教程2025-10-13 18:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

深入解析:Scikit-learn Python机器学习 - 回归分析算法 - Lasso 回归 (Lasso Regression)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

讲给 SRE 听 —— 零基础入门 KNN 分类算法【左扬精讲】:SRE 运维场景实战(含余弦相似度)

讲给 SRE 听 —— 零基础入门 KNN 分类算法【左扬精讲】:SRE 运维场景实战(含余弦相似度) 一、从 SRE 日常工作理解 KNN 的核心逻辑作为 SRE,你是否经常遇到这样的场景:​某天监控告警响起,某台服务器 CPU 突然飙…

【终章】:幸福的复利——打造你的每日幸福微习惯 - 指南

【终章】:幸福的复利——打造你的每日幸福微习惯 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

完整教程:SQLMap注入学习靶机(打靶记录)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:Go 语言中的**数组 (Array)*用法

实用指南:Go 语言中的**数组 (Array)*用法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…