diff options
author | Luck <git@lucko.me> | 2018-12-31 18:15:39 +0000 |
---|---|---|
committer | Luck <git@lucko.me> | 2018-12-31 18:15:39 +0000 |
commit | 9bed6177ddf94f67aaad5ee2504721cf0b957a94 (patch) | |
tree | a830407555e458bc02f220b09b4b40386321eb9c /spark-common/src/main/java/me/lucko/spark/common | |
parent | 66a8afab99efb7ac7669961eb2e67e2244d494e5 (diff) | |
download | spark-9bed6177ddf94f67aaad5ee2504721cf0b957a94.tar.gz spark-9bed6177ddf94f67aaad5ee2504721cf0b957a94.tar.bz2 spark-9bed6177ddf94f67aaad5ee2504721cf0b957a94.zip |
Add '/spark heapdump' command
Diffstat (limited to 'spark-common/src/main/java/me/lucko/spark/common')
-rw-r--r-- | spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java | 10 | ||||
-rw-r--r-- | spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java (renamed from spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapModule.java) | 60 | ||||
-rw-r--r-- | spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java (renamed from spark-common/src/main/java/me/lucko/spark/common/command/modules/MonitoringModule.java) | 2 |
3 files changed, 61 insertions, 11 deletions
diff --git a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java index f73e3e4..ef21d1c 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java +++ b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java @@ -24,15 +24,16 @@ import com.google.common.collect.ImmutableList; import me.lucko.spark.common.command.Arguments; import me.lucko.spark.common.command.Command; -import me.lucko.spark.common.command.modules.HeapModule; -import me.lucko.spark.common.command.modules.MonitoringModule; +import me.lucko.spark.common.command.modules.MemoryModule; import me.lucko.spark.common.command.modules.SamplerModule; +import me.lucko.spark.common.command.modules.TickMonitoringModule; import me.lucko.spark.common.command.tabcomplete.CompletionSupplier; import me.lucko.spark.common.command.tabcomplete.TabCompleter; import me.lucko.spark.sampler.ThreadDumper; import me.lucko.spark.sampler.TickCounter; import me.lucko.spark.util.BytebinClient; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -57,8 +58,8 @@ public abstract class SparkPlatform<S> { private static <T> List<Command<T>> prepareCommands() { ImmutableList.Builder<Command<T>> builder = ImmutableList.builder(); new SamplerModule<T>().registerCommands(builder::add); - new MonitoringModule<T>().registerCommands(builder::add); - new HeapModule<T>().registerCommands(builder::add); + new TickMonitoringModule<T>().registerCommands(builder::add); + new MemoryModule<T>().registerCommands(builder::add); return builder.build(); } @@ -66,6 +67,7 @@ public abstract class SparkPlatform<S> { // abstract methods implemented by each platform public abstract String getVersion(); + public abstract Path getPluginFolder(); public abstract String getLabel(); public abstract void sendMessage(S sender, String message); public abstract void sendMessage(String message); diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java index 318ce25..405b3d3 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/MemoryModule.java @@ -24,26 +24,37 @@ import me.lucko.spark.common.SparkPlatform; import me.lucko.spark.common.command.Command; import me.lucko.spark.common.command.CommandModule; import me.lucko.spark.memory.HeapDump; +import me.lucko.spark.memory.HeapDumpSummary; import okhttp3.MediaType; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.function.Consumer; -public class HeapModule<S> implements CommandModule<S> { +public class MemoryModule<S> implements CommandModule<S> { private static final MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8"); @Override public void registerCommands(Consumer<Command<S>> consumer) { consumer.accept(Command.<S>builder() - .aliases("heap", "memory") + .aliases("heapsummary") + .argumentUsage("run-gc-before", null) .executor((platform, sender, arguments) -> { platform.runAsync(() -> { - platform.sendPrefixedMessage("&7Creating a new heap dump, please wait..."); + if (arguments.boolFlag("run-gc-before")) { + platform.sendPrefixedMessage("&7Running garbage collector..."); + System.gc(); + } - HeapDump heapDump; + platform.sendPrefixedMessage("&7Creating a new heap dump summary, please wait..."); + + HeapDumpSummary heapDump; try { - heapDump = HeapDump.createNew(); + heapDump = HeapDumpSummary.createNew(); } catch (Exception e) { platform.sendPrefixedMessage("&cAn error occurred whilst inspecting the heap."); e.printStackTrace(); @@ -53,7 +64,7 @@ public class HeapModule<S> implements CommandModule<S> { byte[] output = heapDump.formCompressedDataPayload(); try { String key = SparkPlatform.BYTEBIN_CLIENT.postGzippedContent(output, JSON_TYPE); - platform.sendPrefixedMessage("&bHeap dump output:"); + platform.sendPrefixedMessage("&bHeap dump summmary output:"); platform.sendLink(SparkPlatform.VIEWER_URL + key); } catch (IOException e) { platform.sendPrefixedMessage("&cAn error occurred whilst uploading the data."); @@ -63,6 +74,43 @@ public class HeapModule<S> implements CommandModule<S> { }) .build() ); + + consumer.accept(Command.<S>builder() + .aliases("heapdump") + .argumentUsage("run-gc-before", null) + .argumentUsage("include-non-live", null) + .executor((platform, sender, arguments) -> { + platform.runAsync(() -> { + Path pluginFolder = platform.getPluginFolder(); + try { + Files.createDirectories(pluginFolder); + } catch (IOException e) { + // ignore + } + + Path file = pluginFolder.resolve("heap-" + DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss").format(LocalDateTime.now()) + ".hprof"); + boolean liveOnly = !arguments.boolFlag("include-non-live"); + + if (arguments.boolFlag("run-gc-before")) { + platform.sendPrefixedMessage("&7Running garbage collector..."); + System.gc(); + } + + platform.sendPrefixedMessage("&7Creating a new heap dump, please wait..."); + + try { + HeapDump.dumpHeap(file, liveOnly); + } catch (Exception e) { + platform.sendPrefixedMessage("&cAn error occurred whilst creating a heap dump."); + e.printStackTrace(); + return; + } + + platform.sendPrefixedMessage("&bHeap dump written to: " + file.toString()); + }); + }) + .build() + ); } } diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/MonitoringModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java index 608d6b4..d0513ab 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/MonitoringModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java @@ -33,7 +33,7 @@ import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -public class MonitoringModule<S> implements CommandModule<S> { +public class TickMonitoringModule<S> implements CommandModule<S> { /** The tick monitor instance currently running, if any */ private ReportingTickMonitor activeTickMonitor = null; |