diff --git a/src/share/classes/sun/tools/jmap/JMap.java b/src/share/classes/sun/tools/jmap/JMap.java index 5d349fc0c176dcb86ba57012682f5b5524a3ebdf..fe2a0a9490ba9904ea068a43e7af08720e425bf2 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 0000000000000000000000000000000000000000..13b9dd6e676ad9d2b8cb65fa985ec88da890c75e --- /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 <