提交 423f7215 编写于 作者: C Chuansheng Lu 提交者: 云矅

[RAS] Mini-heap dump support for jmap

Summary:
- Port D336186 to Dragonwell
- Added 'mini' option to 'dump' sub-command  of 'jmap' tool

Test Plan: jdk/test/ras

Reviewers: 井桐

Reviewed By: 井桐

Differential Revision: https://aone.alibaba-inc.com/code/D849318
上级 37cd8bfe
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -218,6 +218,7 @@ public class JMap { ...@@ -218,6 +218,7 @@ public class JMap {
private static final String LIVE_OBJECTS_OPTION = "-live"; private static final String LIVE_OBJECTS_OPTION = "-live";
private static final String ALL_OBJECTS_OPTION = "-all"; private static final String ALL_OBJECTS_OPTION = "-all";
private static final String MINIDUMP_OPTION = "-mini";
private static void histo(String pid, boolean live) throws IOException { private static void histo(String pid, boolean live) throws IOException {
VirtualMachine vm = attach(pid); VirtualMachine vm = attach(pid);
InputStream in = ((HotSpotVirtualMachine)vm). InputStream in = ((HotSpotVirtualMachine)vm).
...@@ -240,12 +241,14 @@ public class JMap { ...@@ -240,12 +241,14 @@ public class JMap {
// dump live objects only or not // dump live objects only or not
boolean live = isDumpLiveObjects(options); boolean live = isDumpLiveObjects(options);
boolean mini = isMiniDump(options);
VirtualMachine vm = attach(pid); VirtualMachine vm = attach(pid);
System.out.println("Dumping heap to " + filename + " ..."); String heapName = mini ? "mini-heap" : "heap";
InputStream in = ((HotSpotVirtualMachine)vm). System.out.println("Dumping " + heapName + " to " + filename + " ...");
dumpHeap((Object)filename, InputStream in = ((HotSpotVirtualMachine)vm).dumpHeap((Object)filename,
(live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION)); (live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION),
mini ? MINIDUMP_OPTION : null);
drain(vm, in); drain(vm, in);
} }
...@@ -267,6 +270,8 @@ public class JMap { ...@@ -267,6 +270,8 @@ public class JMap {
// ignore format (not needed at this time) // ignore format (not needed at this time)
} else if (option.equals("live")) { } else if (option.equals("live")) {
// a valid suboption // a valid suboption
} else if (option.equals("mini")) {
// a valid suboption
} else { } else {
// file=<file> - check that <file> is specified // file=<file> - check that <file> is specified
...@@ -294,6 +299,17 @@ public class JMap { ...@@ -294,6 +299,17 @@ public class JMap {
return false; return false;
} }
private static boolean isMiniDump(String arg) {
// options are separated by comma (,)
String options[] = arg.substring(DUMP_OPTION_PREFIX.length()).split(",");
for (String suboption : options) {
if (suboption.equals("mini")) {
return true;
}
}
return false;
}
// Attach to <pid>, existing if we fail to attach // Attach to <pid>, existing if we fail to attach
private static VirtualMachine attach(String pid) { private static VirtualMachine attach(String pid) {
try { try {
...@@ -368,6 +384,7 @@ public class JMap { ...@@ -368,6 +384,7 @@ public class JMap {
System.err.println(" all objects in the heap are dumped."); System.err.println(" all objects in the heap are dumped.");
System.err.println(" format=b binary format"); System.err.println(" format=b binary format");
System.err.println(" file=<file> dump heap to <file>"); System.err.println(" file=<file> dump heap to <file>");
System.err.println(" mini use minidump format (Dragonwell only)");
System.err.println(" Example: jmap -dump:live,format=b,file=heap.bin <pid>"); System.err.println(" Example: jmap -dump:live,format=b,file=heap.bin <pid>");
System.err.println(" -F force. Use with -dump:<dump-options> <pid> or -histo"); System.err.println(" -F force. Use with -dump:<dump-options> <pid> or -histo");
System.err.println(" to force a heap dump or histogram when <pid> does not"); System.err.println(" to force a heap dump or histogram when <pid> does not");
......
#
# Copyright (c) 2019 Alibaba Group Holding Limited. 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. Alibaba designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# 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.
#
#
# @test
# @summary Test jmap options related to mini heap dump
# @library /lib/testlibrary
# @run shell/timeout=300 TestMiniHeapDumpOpts.sh
#
set -x
# determine platform dependant variables
OS=`uname -s`
case ${OS} in
Linux)
FS=/
;;
*)
exit 1
;;
esac
JMAP=${TESTJAVA}${FS}bin${FS}jmap
JAVAC=${TESTJAVA}${FS}bin${FS}javac
JAVA=${TESTJAVA}${FS}bin${FS}java
JPS=${TESTJAVA}${FS}bin${FS}jps
# Basic options
if [ ! -f ${JMAP} ]; then
echo "Cannot find jmap!"
exit 1
fi
if [ -z "$(${JMAP} -h 2>&1 | grep 'mini use minidump format (Dragonwell only)')" ]; then
echo "Cannot find minidump option from 'jmap -h'"
exit 1
fi
# Test if -dump:mini options works without error
cat > Loop.java <<EOF
public class Loop {
public static void main(String[] args) {
while(true);
}
}
EOF
${JAVAC} Loop.java
if [ $? != 0 ]; then exit 1; fi
${JAVA} -cp . Loop&
PID=$(${JPS} | grep 'Loop' | awk '{print $1}')
if [ $? != 0 ] || [ -z "${PID}" ]; then exit 1; fi
${JMAP} -dump:format=b,mini,file=heap.bin ${PID}
if [ $? != 0 ] || [ ! -f "${PWD}/heap.bin" ]; then exit 1; fi
kill -9 ${PID}
if [ $? != 0 ]; then exit 1; fi
exit 0
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册