From 788a61af26563f6f0d73b47c64d1bf8f6547997d Mon Sep 17 00:00:00 2001 From: Luck Date: Sun, 13 Jan 2019 11:34:48 +0000 Subject: Add support for creating .phd heap dumps with OpenJ9 JVMs --- .../main/java/me/lucko/spark/memory/HeapDump.java | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'spark-common/src/main/java/me/lucko/spark/memory') diff --git a/spark-common/src/main/java/me/lucko/spark/memory/HeapDump.java b/spark-common/src/main/java/me/lucko/spark/memory/HeapDump.java index d91c476..4017d64 100644 --- a/spark-common/src/main/java/me/lucko/spark/memory/HeapDump.java +++ b/spark-common/src/main/java/me/lucko/spark/memory/HeapDump.java @@ -22,6 +22,7 @@ package me.lucko.spark.memory; import java.io.IOException; import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; import java.nio.file.Path; import javax.management.JMX; @@ -46,11 +47,28 @@ public final class HeapDump { * @throws Exception catch all */ public static void dumpHeap(Path outputPath, boolean live) throws Exception { - MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer(); - ObjectName diagnosticBeanName = ObjectName.getInstance(DIAGNOSTIC_BEAN); + String outputPathString = outputPath.toAbsolutePath().normalize().toString(); - HotSpotDiagnosticMXBean proxy = JMX.newMXBeanProxy(beanServer, diagnosticBeanName, HotSpotDiagnosticMXBean.class); - proxy.dumpHeap(outputPath.toAbsolutePath().normalize().toString(), live); + if (isOpenJ9()) { + Class dumpClass = Class.forName("com.ibm.jvm.Dump"); + Method heapDumpMethod = dumpClass.getMethod("heapDumpToFile", String.class); + heapDumpMethod.invoke(null, outputPathString); + } else { + MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer(); + ObjectName diagnosticBeanName = ObjectName.getInstance(DIAGNOSTIC_BEAN); + + HotSpotDiagnosticMXBean proxy = JMX.newMXBeanProxy(beanServer, diagnosticBeanName, HotSpotDiagnosticMXBean.class); + proxy.dumpHeap(outputPathString, live); + } + } + + public static boolean isOpenJ9() { + try { + Class.forName("com.ibm.jvm.Dump"); + return true; + } catch (ClassNotFoundException e) { + return false; + } } public interface HotSpotDiagnosticMXBean { -- cgit