8240989: convert clhsdb "dumpheap" command from javascript to java
Reviewed-by: amenkov, ysuenaga
This commit is contained in:
parent
acafdb3f60
commit
965404dd98
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot
test/hotspot/jtreg
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -74,6 +74,7 @@ import sun.jvm.hotspot.runtime.JavaVFrame;
|
||||
import sun.jvm.hotspot.runtime.Threads;
|
||||
import sun.jvm.hotspot.runtime.VM;
|
||||
import sun.jvm.hotspot.tools.ObjectHistogram;
|
||||
import sun.jvm.hotspot.tools.JMap;
|
||||
import sun.jvm.hotspot.tools.PMap;
|
||||
import sun.jvm.hotspot.tools.PStack;
|
||||
import sun.jvm.hotspot.tools.StackTrace;
|
||||
@ -1702,6 +1703,29 @@ public class CommandProcessor {
|
||||
}
|
||||
}
|
||||
},
|
||||
new Command("dumpheap", "dumpheap [filename]", false) {
|
||||
public void doit(Tokens t) {
|
||||
if (t.countTokens() > 1) {
|
||||
usage();
|
||||
} else {
|
||||
JMap jmap = new JMap();
|
||||
String filename;
|
||||
if (t.countTokens() == 1) {
|
||||
filename = t.nextToken();
|
||||
} else {
|
||||
filename = "heap.bin";;
|
||||
}
|
||||
try {
|
||||
jmap.writeHeapHprofBin(filename);
|
||||
} catch (Exception e) {
|
||||
err.println("Error: " + e);
|
||||
if (verboseExceptions) {
|
||||
e.printStackTrace(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
private boolean verboseExceptions = false;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#############################################################################
|
||||
|
||||
resourcehogs/serviceability/sa/TestHeapDumpForLargeArray.java 8220624 generic-all
|
||||
serviceability/sa/ClhsdbDumpheap.java 8220624 generic-all
|
||||
serviceability/sa/CDSJMapClstats.java 8220624 generic-all
|
||||
serviceability/sa/ClhsdbCDSJstackPrintAll.java 8220624 generic-all
|
||||
serviceability/sa/ClhsdbFindPC.java#id0 8220624 generic-all
|
||||
|
@ -102,6 +102,7 @@ serviceability/sa/ClhsdbAttach.java 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbCDSCore.java 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbCDSJstackPrintAll.java 8193639 solaris-all
|
||||
serviceability/sa/CDSJMapClstats.java 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbDumpheap.java 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbField.java 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbFindPC.java#id0 8193639 solaris-all
|
||||
serviceability/sa/ClhsdbFindPC.java#id1 8193639 solaris-all
|
||||
|
83
test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java
Normal file
83
test/hotspot/jtreg/serviceability/sa/ClhsdbDumpheap.java
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import jdk.test.lib.apps.LingeredApp;
|
||||
import jdk.test.lib.hprof.parser.HprofReader;
|
||||
import jtreg.SkippedException;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8240989
|
||||
* @summary Test clhsdb dumpheap command
|
||||
* @requires vm.hasSA
|
||||
* @library /test/lib
|
||||
* @run main/othervm ClhsdbDumpheap
|
||||
*/
|
||||
|
||||
public class ClhsdbDumpheap {
|
||||
public static void printStackTraces(String file) {
|
||||
try {
|
||||
System.out.println("HprofReader.getStack() output:");
|
||||
String output = HprofReader.getStack(file, 0);
|
||||
if (!output.contains("LingeredApp.main")) {
|
||||
throw new RuntimeException("'LingeredApp.main' missing from stdout/stderr");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException("Test ERROR " + ex, ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("Starting ClhsdbDumpheap test");
|
||||
|
||||
LingeredApp theApp = null;
|
||||
try {
|
||||
String heapDumpFileName = "heapdump.bin";
|
||||
ClhsdbLauncher test = new ClhsdbLauncher();
|
||||
|
||||
theApp = new LingeredApp();
|
||||
LingeredApp.startApp(theApp);
|
||||
System.out.println("Started LingeredApp with pid " + theApp.getPid());
|
||||
|
||||
List<String> cmds = List.of("dumpheap " + heapDumpFileName);
|
||||
|
||||
Map<String, List<String>> expStrMap = new HashMap<>();
|
||||
expStrMap.put("dumpheap", List.of(
|
||||
"heap written to " + heapDumpFileName));
|
||||
|
||||
test.run(theApp.getPid(), cmds, expStrMap, null);
|
||||
printStackTraces(heapDumpFileName);
|
||||
} catch (SkippedException se) {
|
||||
throw se;
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException("Test ERROR " + ex, ex);
|
||||
} finally {
|
||||
LingeredApp.stopApp(theApp);
|
||||
}
|
||||
System.out.println("Test PASSED");
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user