From 89a61ff18b29935a6d7585613a283702678ea2d9 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Mon, 2 Sep 2019 19:40:03 +0800 Subject: [PATCH] add heapdump command. #837 --- .../core/command/BuiltinCommandPack.java | 2 + .../command/monitor200/HeapDumpCommand.java | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/BuiltinCommandPack.java b/core/src/main/java/com/taobao/arthas/core/command/BuiltinCommandPack.java index 0b78b419c..072945068 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/BuiltinCommandPack.java +++ b/core/src/main/java/com/taobao/arthas/core/command/BuiltinCommandPack.java @@ -26,6 +26,7 @@ import com.taobao.arthas.core.command.klass100.RedefineCommand; import com.taobao.arthas.core.command.klass100.SearchClassCommand; import com.taobao.arthas.core.command.klass100.SearchMethodCommand; import com.taobao.arthas.core.command.monitor200.DashboardCommand; +import com.taobao.arthas.core.command.monitor200.HeapDumpCommand; import com.taobao.arthas.core.command.monitor200.JvmCommand; import com.taobao.arthas.core.command.monitor200.MBeanCommand; import com.taobao.arthas.core.command.monitor200.MonitorCommand; @@ -78,6 +79,7 @@ public class BuiltinCommandPack implements CommandResolver { commands.add(Command.create(RedefineCommand.class)); commands.add(Command.create(DashboardCommand.class)); commands.add(Command.create(DumpClassCommand.class)); + commands.add(Command.create(HeapDumpCommand.class)); commands.add(Command.create(JulyCommand.class)); commands.add(Command.create(ThanksCommand.class)); commands.add(Command.create(OptionsCommand.class)); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java new file mode 100644 index 000000000..9b1b7580e --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java @@ -0,0 +1,83 @@ +package com.taobao.arthas.core.command.monitor200; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.sun.management.HotSpotDiagnosticMXBean; +import com.taobao.arthas.core.command.Constants; +import com.taobao.arthas.core.shell.command.AnnotatedCommand; +import com.taobao.arthas.core.shell.command.CommandProcess; +import com.taobao.arthas.core.util.LogUtil; +import com.taobao.middleware.cli.annotations.Argument; +import com.taobao.middleware.cli.annotations.Description; +import com.taobao.middleware.cli.annotations.Name; +import com.taobao.middleware.cli.annotations.Option; +import com.taobao.middleware.cli.annotations.Summary; +import com.taobao.middleware.logger.Logger; + +/** + * HeapDump command + * + * @author hengyunabc 2019-09-02 + * + */ +@Name("heapdump") +@Summary("Heap dump") +@Description("\nExamples:\n" + " heapdump\n" + " heapdump --live\n" + " heapdump --live /tmp/dump.hprof\n" + + Constants.WIKI + Constants.WIKI_HOME + "heapdump") +public class HeapDumpCommand extends AnnotatedCommand { + private static final Logger logger = LogUtil.getArthasLogger(); + private String file; + + private boolean live; + + @Argument(argName = "file", index = 0, required = false) + @Description("Output file") + public void setFile(String file) { + this.file = file; + } + + @Option(shortName = "l", longName = "live", flag = true) + @Description("Only dump live objects, default value true") + public void setLive(boolean live) { + this.live = live; + } + + @Override + public void process(CommandProcess process) { + int status = 0; + try { + String dumpFile = file; + if (dumpFile == null || dumpFile.isEmpty()) { + String date = new SimpleDateFormat("yyyy-MM-dd-HH-mm").format(new Date()); + File file = File.createTempFile("heapdump" + date + (live ? "-live" : ""), ".hprof"); + dumpFile = file.getAbsolutePath(); + file.delete(); + } + + process.write("Dumping heap to " + dumpFile + "...\n"); + + run(process, dumpFile, live); + + process.write("Heap dump file created\n"); + + } catch (Throwable t) { + logger.error("arthas", "heap dump error", t); + process.write("Heap dump error: " + t.getMessage() + '\n'); + status = 1; + } finally { + process.end(status); + } + + } + + private static void run(CommandProcess process, String file, boolean live) throws IOException { + HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean = ManagementFactory + .getPlatformMXBean(HotSpotDiagnosticMXBean.class); + hotSpotDiagnosticMXBean.dumpHeap(file, live); + } + +}