From 423f7215ada575862124d1742c45b928daaab4c4 Mon Sep 17 00:00:00 2001 From: Chuansheng Lu Date: Mon, 11 Mar 2019 09:42:40 +0800 Subject: [PATCH] [RAS] Mini-heap dump support for jmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/share/classes/sun/tools/jmap/JMap.java | 27 ++++++-- test/ras/TestMiniHeapDumpOpts.sh | 78 ++++++++++++++++++++++ 2 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 test/ras/TestMiniHeapDumpOpts.sh diff --git a/src/share/classes/sun/tools/jmap/JMap.java b/src/share/classes/sun/tools/jmap/JMap.java index 5d349fc0c..fe2a0a949 100644 --- a/src/share/classes/sun/tools/jmap/JMap.java +++ b/src/share/classes/sun/tools/jmap/JMap.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -218,6 +218,7 @@ public class JMap { private static final String LIVE_OBJECTS_OPTION = "-live"; 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 { VirtualMachine vm = attach(pid); InputStream in = ((HotSpotVirtualMachine)vm). @@ -240,12 +241,14 @@ public class JMap { // dump live objects only or not boolean live = isDumpLiveObjects(options); + boolean mini = isMiniDump(options); VirtualMachine vm = attach(pid); - System.out.println("Dumping heap to " + filename + " ..."); - InputStream in = ((HotSpotVirtualMachine)vm). - dumpHeap((Object)filename, - (live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION)); + String heapName = mini ? "mini-heap" : "heap"; + System.out.println("Dumping " + heapName + " to " + filename + " ..."); + InputStream in = ((HotSpotVirtualMachine)vm).dumpHeap((Object)filename, + (live ? LIVE_OBJECTS_OPTION : ALL_OBJECTS_OPTION), + mini ? MINIDUMP_OPTION : null); drain(vm, in); } @@ -267,6 +270,8 @@ public class JMap { // ignore format (not needed at this time) } else if (option.equals("live")) { // a valid suboption + } else if (option.equals("mini")) { + // a valid suboption } else { // file= - check that is specified @@ -294,6 +299,17 @@ public class JMap { 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 , existing if we fail to attach private static VirtualMachine attach(String pid) { try { @@ -368,6 +384,7 @@ public class JMap { System.err.println(" all objects in the heap are dumped."); System.err.println(" format=b binary format"); System.err.println(" file= dump heap to "); + System.err.println(" mini use minidump format (Dragonwell only)"); System.err.println(" Example: jmap -dump:live,format=b,file=heap.bin "); System.err.println(" -F force. Use with -dump: or -histo"); System.err.println(" to force a heap dump or histogram when does not"); diff --git a/test/ras/TestMiniHeapDumpOpts.sh b/test/ras/TestMiniHeapDumpOpts.sh new file mode 100644 index 000000000..13b9dd6e6 --- /dev/null +++ b/test/ras/TestMiniHeapDumpOpts.sh @@ -0,0 +1,78 @@ +# +# 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 <