/spark heapdump
基本信息
| 属性 | 值 |
|---|---|
| 命令名 | heapdump |
| 别名 | 无 |
| 来源 | HeapAnalysisModule.heapDump(HeapAnalysisModule.java:68) |
| 参数 | --compress <type>、--run-gc-before、--include-non-live |
| Tab 补全 | TabCompleter.completeForOpts(arguments, "--compress", "--run-gc-before", "--include-non-live") |
生成完整的 JVM 堆快照(.hprof)。这是 spark 中唯一会长时间阻塞且可能显著影响服务器性能的操作。
功能
执行顺序(HeapAnalysisModule.heapDump):
- 先确定文件路径:
platform.resolveSaveFile("heap", HeapDump.isOpenJ9() ? "phd" : "hprof")- 扩展名按 JVM 实现分支:OpenJ9 用
.phd,其余(含 HotSpot)用.hprof
- 扩展名按 JVM 实现分支:OpenJ9 用
liveOnly = !arguments.boolFlag("include-non-live")—— 默认只导出存活对象,加--include-non-live才包含已死未回收的对象- 若传
--run-gc-before:广播「Running garbage collector…」并System.gc() - 广播「Creating a new heap dump, please wait…」,调用
HeapDump.dumpHeap(file, liveOnly);异常时广播「An error occurred whilst creating a new heap dump.」(红色)并返回 - 成功则广播「Heap dump written to: <绝对路径>」,并记入活动日志(
Activity.fileActivity) - 若传了
--compress,再执行压缩
heapdump 不做网络上传,与 profiler / heapsummary 的默认行为相反:产物只落在本地磁盘。
压缩
--compress <type> 的取值来自 Compression 枚举,用 valueOf(upperCase) 解析,解析失败会被静默忽略(catch (IllegalArgumentException e) { // ignore }),即拼错类型不会报错,只是不压缩。
| 类型 | 输出扩展名 | 实现 |
|---|---|---|
GZIP |
.gz |
Compression.GZIP,GZIPOutputStream 缓冲区 64 KiB(1024 * 64) |
XZ 压缩在本版本中被注释掉了(Compression.java:46-51 以 // XZ { 开头),源码中无 XZ 枚举常量 —— 传 --compress xz 会被静默忽略。
压缩过程有进度回报:progressHandler 每当距上次回报超过 5 秒,就异步广播「Compressed <已压> / <总量> so far… (<百分比>)」。
完成后广播压缩比摘要与新文件路径:「Compression complete: <原大小> --> <压缩后> (<百分比>)」及「Compressed heap dump written to: <路径>」。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 默认导出范围 | 仅存活对象(liveOnly = true) |
HeapAnalysisModule.heapDump |
| 扩展名(HotSpot) | hprof |
HeapDump.isOpenJ9() ? "phd" : "hprof" |
| 扩展名(OpenJ9) | phd |
同上 |
| 压缩类型 | 仅 GZIP 有效 |
Compression 枚举 |
| GZIP 缓冲区 | 64 KiB | Compression.GZIP(1024 * 64) |
| 压缩进度回报间隔 | 5 秒 | heapDumpCompress 内 TimeUnit.SECONDS.toMillis(5) |
| 文件名时间戳格式 | yyyy-MM-dd_HH.mm.ss |
SparkPlatform.DATE_TIME_FORMATTER |
交互
| 触发 | 行为 |
|---|---|
| 不带 flag | 写 <config>/spark/heap-<时间戳>.hprof |
--include-non-live |
导出含死对象,文件更大 |
--run-gc-before |
先 System.gc(),可减小输出体积 |
--compress gzip |
额外产出 .gz 文件 |
--compress <拼错的类型> |
静默忽略,仅产出未压缩的 dump |
| 在 OpenJ9 上运行 | 扩展名为 .phd 而非 .hprof |
相关条目
- /spark heapsummary - 轻量替代方案,不阻塞、不需要压缩
- 配置目录文件 - 堆快照的落盘位置
- /spark activity - 本次 dump 会记入活动日志