
开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载VJDump 是唯品会 VJTools 工具集vjdump 目录中面向线上紧急故障场景的 JVM 诊断数据收集脚本当应用即将被重启、原因尚不明朗时它能在最短时间内一键打包 jstack、jmap、GC 日志等关键诊断材料。本文以 vjdump.sh 脚本源码为骨架完整讲解其收集内容、命令行参数、执行流程与注意事项帮助你在大故障发生时不留遗憾地保留离线分析的证据。1. 为什么需要 VJDump紧急故障场景下的取舍大型系统发生重大故障且原因未知时重启往往是平息用户投诉的唯一选择。但故障现场转瞬即逝——在慌乱中连经验丰富的系统管理员也可能遗漏本该保留的离线分析素材。VJDump 脚本正是为此设计它将jstack、jmap、GC 日志等命令的输出一键打包成单个 zip 文件默认存放于/tmp/vjtools/vjdump为事后完整分析保留现场证据allow for complete analysis later。需要特别强调的是VJDump 并非日常巡检工具而是急诊工具[重要]jstack、jmap等命令会造成目标应用的 stop-the-world全局停顿。在生产环境执行完整检查前请务必确认目标应用已从用户流量中隔离如已摘流量。这也是整个脚本设计的最核心约束所有可能导致停顿的收集指令之间默认插入 1 秒的执行间隔以避免连续停顿叠加造成更长的不可用时间见中文版说明 vjdump/README.md。2. VJDump 收集的数据清单VJDump 围绕一次故障排查需要哪些证据来组织收集内容具体包括数据项收集命令说明线程转储Thread Dumpjstack -l $PID含锁信息的长格式线程栈排查死锁、线程卡死必备JVM 概况与繁忙线程快照vjtop.sh -n 1 -d 3 $PID仅当本机安装了 vjtop 且vjtop.sh所在目录已加入 PATH 环境变量时启用堆对象统计jmap -histo $PID与jmap -histo:live $PID前者统计全部对象后者先触发一次 Full GC 再统计存活对象GC 日志复制-Xloggc指定的日志文件仅当 JVM 启动参数中配置了 GC 日志输出时存在堆转储Heap Dumpjmap -dump:live,formatb,file${DUMP_FILE} $PID可选开关通过--liveheap参数开启其中 vjtop 是本仓库中的兄弟工具见 vjtop/README.md它以接近top的交互体验实时展示 JVM 进程指标与繁忙线程运行时不造成应用停顿可在线上安全使用。VJDump 调用 vjtop 采集的是一次JVM 概况 繁忙线程快照与 jstack 的静态线程栈互为补充——jstack 回答线程栈长什么样vjtop 回答哪些线程在忙、忙到什么程度。3. 使用前的准备3.1 下载脚本从仓库获取 vjdump.sh也可按 vjdump/README_EN.md 中的说明下载发布版本放置到 PATH 中任意目录并赋予执行权限然后直接以脚本名调用chmod x vjdump.sh vjdump.sh $pid3.2 运行用户与权限要求务必使用与目标进程相同的系统用户运行脚本或使用 root并在目标进程同一台机器上执行收集结果统一落在/tmp/vjtools/vjdump。这与 jstack、jmap 的权限模型一致只有目标 JVM 的启动用户或 root才能通过 attach 机制访问该进程。3.3 JAVA_HOME 的定位脚本对$JAVA_HOME的处理很宽容vjdump.sh优先读取环境变量JAVA_HOME若未设置则通过readlink -f \which java反推 java 可执行文件所在的 JDK 安装目录再剔除jre/bin/java或/bin/java 后缀得到 JAVA_HOME若最终找不到$JAVA_HOME/bin/jstack脚本会以红色提示$JAVA_HOME not found. please export JAVA_HOME manually.并退出。建议在关键服务器上显式export JAVA_HOME避免依赖自动探测。3.4 可选依赖vjtopVJDump 会先执行which vjtop.sh探测vjdump.sh找到 vjtop执行vjtop.sh -n 3 -d 1 $PID输出保存为vjtop-$PID-$DATE.log未找到 vjtop降级为替代方案——jinfo -flags $PID保存 JVM 启动参数对应jinfo-flags-$PID-$DATE.log加jmap -heap $PID保存堆配置概览对应jmap_heap-$PID-$DATE.log。也就是说即使没有安装 vjtop脚本依然能通过 JDK 自带工具完成基本采集vjtop 只是锦上添花。若想启用 vjtop 采集请先将vjtop.sh所在目录加入 PATHvjdump/README.md 有明确说明。4. 快速上手4.1 最小用法只收集常规诊断数据# 对指定进程 PID 进行紧急诊断收集 vjdump.sh $pid此命令依次执行 jstack、vjtop或降级命令、jmap histo 两项、GC 日志复制最后打包生成 zip。4.2 开启堆转储适合堆内存类故障# 额外收集 heap dumpjmap -dump:live 输出耗时更长 vjdump.sh --liveheap $pid开启后脚本会额外执行jmap -dump:live,formatb,file...生成二进制堆转储文件并单独打包为带 heap 字样的 zip见第 6 节避免大体积堆转储文件污染常规诊断包。5. 完整命令行参数详解脚本自带的 usage 说明为vjdump.shusage: $0 [--liveheap][-nz|--nozip][-i|--interval] pid参数解析逻辑位于脚本开头vjdump.sh支持的全部参数如下参数别名默认值作用pid—必填目标 JVM 进程 ID作为位置参数传入-i 秒--interval1各停顿类收集指令之间的执行间隔秒-nz--nozip关闭跳过最后的 zip 打包仅保留各 .log 文件--liveheap—关闭额外执行jmap -dump:live收集堆转储对参数的使用注意三点参数必须位于 pid 之前如vjdump.sh --liveheap 12345、vjdump.sh -i 3 12345脚本用循环解析完选项后才将剩余参数视为 pidvjdump.sh。-i的作用默认 1 秒用于在jstack、jmap -histo:live、jmap -dump:live等会造成 JVM 停顿的命令之间插入缓冲脚本通过sleep ${SLEEP_TIME}实现见 vjdump.sh、L112、L122、L134。如果目标应用流量已完全摘除、对停顿不敏感可以调小反之应调大。-nz的适用场景当你只想快速拿到日志文件、不希望等待 zip 压缩或准备用外部脚本对产物做后续处理时使用。6. 执行流程与产物命名6.1 一次完整收集的流程脚本主体逻辑全部封装在START()函数中vjdump.sh按以下顺序执行校验与清理校验 pid 非空、JAVA_HOME 可用并清理/tmp/vjtools/vjdump下历史.log与旧堆转储文件然后创建输出目录jstackjstack -l $PID→jstack-$PID-$DATE.logvjtop可选探测到vjtop.sh则执行vjtop.sh -n 3 -d 1 $PID→vjtop-$PID-$DATE.log否则降级执行jinfo -flags与jmap -heapjmap histojmap -histo $PID→jmap_histo-$PID-$DATE.log停顿后sleepjmap histo:livejmap -histo:live $PID→jmap_histo_live-$PID-$DATE.log停顿后sleepjmap dump:live可选仅当--liveheap时执行产物为jmap_dump_live-$PID-$DATE.binGC 日志通过strings /proc/$PID/cmdline | grep \-Xloggc | cut -d : -f 2从进程启动参数中解析出 GC 日志路径vjdump.sh找到则用\cp -rf跳过 cp 别名、强制覆盖复制到输出目录未配置则提示No GC log existing.打包见下文。其中$DATE为date %Y%m%d%H%M%S格式的时间戳因此同一 pid 多次执行不会覆盖历史产物。6.2 打包策略与产物清单打包逻辑位于脚本末尾vjdump.sh默认使用zip命令压缩所有.log文件生成/tmp/vjtools/vjdump-$PID-$DATE.zip若系统没有zip命令自动降级为tar -zcvf生成/tmp/vjtools/vjdump-$PID-$DATE.tar.gz若同时开启了--liveheap还会再生成一个包含堆转储的独立压缩包/tmp/vjtools/vjdump-with-heap-$PID-$DATE.zip或对应.tar.gz这样大体积的 heap dump 不会混入常规诊断包若指定了-nz/--nozip则跳过所有压缩只保留输出目录下的原始文件。最终输出目录$BASEDIR/vjdump即/tmp/vjtools/vjdump下的完整文件清单如下文件对应命令jstack-$PID-$DATE.logjstack -l $PIDvjtop-$PID-$DATE.logvjtop.sh -n 3 -d 1 $PID安装了 vjtop 时jinfo-flags-$PID-$DATE.logjinfo -flags $PID未装 vjtop 时jmap_heap-$PID-$DATE.logjmap -heap $PID未装 vjtop 时jmap_histo-$PID-$DATE.logjmap -histo $PIDjmap_histo_live-$PID-$DATE.logjmap -histo:live $PIDjmap_dump_live-$PID-$DATE.binjmap -dump:live,formatb,file...--liveheap时*gc*.log原 GC 日志文件名从-Xloggc参数解析后复制7. 常见问题与最佳实践7.1 命令失败不会中断整体收集脚本对每一步都做了健壮性处理任一命令执行失败$? ! 0时仅打印红色错误提示process xxx error.不会中断后续收集。这意味着在极端情况下即使 jstack 失败histo 与 GC 日志仍会被保留最大化现场证据的完整度。7.2 关于 vjtop 的参数-n 1 -d 3文档与脚本中 vjtop 的调用参数略有差异README 示例为vjtop.sh -n 1 -d 3 $PID采集 1 轮、间隔 3 秒而脚本实际执行vjtop.sh -n 3 -d 1 $PID采集 3 轮、间隔 1 秒。二者的参数语义在 vjtop 源码的参数解析器中是统一的OptionAdvanceParser.java-n / --iteration输出迭代次数即采集几轮快照-i / --interval / -d每轮输出之间的间隔秒数默认 10 秒且不能小于 1OptionAdvanceParser.java。理解这一点后你可以根据现场情况调整比如只想快速留一张快照可用-n 1 -d 3想留稍长一点的时间序列可用脚本默认的-n 3 -d 1。7.3 与 vjmap 等兄弟工具配合vjdump 收集的是证据而证据的深度分析可以交给 VJTools 的其他工具vjmap 提供按分代Survivor、Old、Metaspace 等解析堆直方图的增强版 jmap适合对jmap -histo类输出做深入分析vjtop 适合在日常或压测中持续观察 JVM 进程指标与繁忙线程是 vjdump 中繁忙线程快照的来源vjmxcli 可用于通过 JMX 快速查看运行参数。7.4 生产环境执行清单先确认已摘流量任何含:live后缀或 dump 的 jmap 命令都会触发 Full GC 级别的停顿使用目标进程的启动用户执行避免 attach 权限问题建议显式设置 JAVA_HOME避免自动探测偏差收集后及时下载压缩包并注意/tmp目录可能被系统清理策略清空建议将产物转存到持久化存储若堆内存很大--liveheap可能耗时较长且占用大量磁盘空间请评估磁盘余量后再开启非紧急场景下不要反复运行本脚本做演练每次jmap -histo:live都会引入真实停顿。8. 小结VJDump 以极低的运维成本解决了紧急故障重启前如何快速、完整地保留现场证据这一实际问题一条命令即可完成线程栈、堆统计、JVM 概况、GC 日志乃至堆转储的收集与打包并通过默认 1 秒的停顿间隔与失败不中断的容错设计尽量降低对故障应用的影响。配合 vjtop、vjmap 等 VJTools 兄弟工具可以形成从现场采集到离线深挖的完整 JVM 故障排查链路。相关英文版说明见 vjdump/README_EN.md中文版见 vjdump/README.md。赞分享开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载相关推荐7个Android图片选择器PictureSelector紧急故障诊断与快速修复指南7个Android图片选择器PictureSelector紧急故障诊断与快速修复指南 PictureSelector是一款功能强大的Android图片选择器库移动开发UI组件音视频柯南平台Conan常见问题解答新手必知的15个流量回放技巧柯南平台Conan常见问题解答新手必知的15个流量回放技巧 柯南平台Conan是一款专业的流量回放全流程解决方案经过在线教育业务中的持续打磨与迭代为用户提数据库同步故障急救Electric一键修复命令指南数据库同步故障急救Electric一键修复命令指南 你是否曾因PostgreSQL WALWrite Ahead Logging预写日志损坏导致Elec后端数据同步数据库人工智能AI AgentMCP 服务上一篇让老Mac焕发新生OpenCore Legacy Patcher完全指南下一篇WorkshopDL终极Steam创意工坊下载器无需Steam也能获取海量游戏模组创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考