8202392: [TESTBUG] open source vm testbase heapdump tests
authoriignatyev
Tue, 15 May 2018 11:28:29 -0700
changeset 50112 7a2a740815b7
parent 50111 1dc98fa30b14
child 50113 caf115bb98ad
8202392: [TESTBUG] open source vm testbase heapdump tests Reviewed-by: sspitsyn, mseledtsov
test/hotspot/jtreg/ProblemList.txt
test/hotspot/jtreg/TEST.groups
test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/JMapHeapCore/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/JMapHeapCore/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/TEST.properties
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/TestDescription.java
test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/run.sh
test/hotspot/jtreg/vmTestbase/heapdump/README
test/hotspot/jtreg/vmTestbase/heapdump/share/EatMemory.java
test/hotspot/jtreg/vmTestbase/heapdump/share/common.sh
--- a/test/hotspot/jtreg/ProblemList.txt	Tue May 15 14:35:51 2018 +0200
+++ b/test/hotspot/jtreg/ProblemList.txt	Tue May 15 11:28:29 2018 -0700
@@ -123,4 +123,7 @@
 vmTestbase/nsk/jdi/EventQueue/remove_l/remove_l005/TestDescription.java 8068225 generic-all
 vmTestbase/nsk/jdi/stress/ClassPrepareEvents/ClassPrepareEvents001/ClassPrepareEvents001.java 6426321 generic-all
 
+vmTestbase/heapdump/JMapHeapCore/TestDescription.java 8023376,8001227,8051445 generic-all
+vmTestbase/heapdump/JMapMetaspaceCore/TestDescription.java 8023376,8001227,8051445 generic-all
+
 #############################################################################
--- a/test/hotspot/jtreg/TEST.groups	Tue May 15 14:35:51 2018 +0200
+++ b/test/hotspot/jtreg/TEST.groups	Tue May 15 11:28:29 2018 -0700
@@ -1150,3 +1150,14 @@
   vmTestbase/nsk/jdi/StackFrame/getArgumentValues/getArgumentValues002/getArgumentValues002.java \
   vmTestbase/nsk/jdi/StackFrame/getArgumentValues/getArgumentValues003/getArgumentValues003.java
 
+# Heap dump tests
+vmTestbase_vm_heapdump = \
+  vmTestbase/heapdump/
+
+vmTestbase_vm_heapdump_quick = \
+  vmTestbase/heapdump/OnOOMToFile/TestDescription.java \
+  vmTestbase/heapdump/OnOOMToFileMetaspace/TestDescription.java \
+  vmTestbase/heapdump/OnOOMToPath/TestDescription.java \
+  vmTestbase/heapdump/JMapHeapCore/TestDescription.java \
+  vmTestbase/heapdump/JMapMetaspace/TestDescription.java
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/JMapHeap.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk]
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies that heap dump created by JMap is able to be
+ *     parsed by HprofParser. It fills the heap with objects of different types
+ *     till OutOfMemoryError, then uses JMap to create heap dump and then
+ *     verifies created heap dump with HprofParser.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapHeap/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,51 @@
+#!/bin/sh
+# Copyright (c) 2007, 2018, 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.
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit -Xmx1G"
+
+DUMPFILE=heap.bin
+
+rm -f ${DUMPFILE}
+
+JMAP_DUMP_OPT="-dump:format=b,file=${DUMPFILE}"
+
+${JAVA} ${JAVA_OPTS} heapdump.share.EatMemory -exec "${JMAP} ${JMAP_DUMP_OPT} %p"
+
+status=$?
+
+if [ $status -ne 0 ]; then
+        fail "Java exited with exit status: $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: $DUMPFILE"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapHeapCore/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/JMapHeapCore.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent.jdk, quick, quarantine]
+ * VM testbase comments: JDK-8023376 JDK-8001227 JDK-8051445
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies that heap dump created by jhsdb is able to be
+ *     parsed by HprofParser. It fills the heap with objects of different types
+ *     till OutOfMemoryError, forces core dump, then uses jhsdb on core file
+ *     to create heap dump and then verifies created heap dump with HprofParser.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapHeapCore/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,88 @@
+#!/bin/sh
+#
+# Copyright (c) 2007, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit -XX:-TransmitErrorReport"
+
+if [ $CORE_SUPPORTED -eq 0 ]; then
+        pass "Core dump is not supported"
+fi
+
+DUMPFILE=heap.bin
+
+rm -f ${DUMPFILE}
+
+ulimit -c unlimited || true
+
+echo "Below 'Unexpected error' is actually expected - JVM is forced to dump core"
+${JAVA} ${JAVA_OPTS} heapdump.share.EatMemory -core &
+
+pid=$!
+
+wait $pid
+
+status=$?
+
+if [ $status -eq 0 ]; then
+        pass "Java exited with exit status: $status"
+fi
+
+for CORE in core* /cores/core.$pid; do
+        [ -e "$CORE" ] && break;
+done
+
+if [ ! -f "$CORE" ]; then
+        fail "Java exited with exit status: $status, but core file was not created"
+fi
+echo "Found core file: $CORE"
+
+JMAP_DUMP_OPT="--binaryheap --dumpfile=${DUMPFILE}"
+EXE_OPT="--exe"
+CORE_OPT="--core"
+JHSDB_OPT="jmap"
+
+${JHSDB} ${JHSDB_OPT} ${JMAP_DUMP_OPT} ${EXE_OPT} ${JAVA} ${CORE_OPT} ${CORE}
+
+status=$?
+if [ $status -ne 0 ]; then
+        fail "jmap exited with exit status $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: $DUMPFILE"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+if [ "$TEST_CLEANUP" != "false" ]; then
+        rm -f ${CORE}
+        rm -f hs_err_pid*
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/JMapMetaspace.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk, quick]
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies that heap dump created by JMap is able to be
+ *     parsed by HprofParser. It fills metaspace with classes till OutOfMemoryError,
+ *     then uses JMap to create heap dump and then verifies created heap dump with HprofParser.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspace/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Copyright (c) 2014, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit -XX:MaxMetaspaceSize=64m"
+
+DUMPFILE=heap.bin
+
+rm -f ${DUMPFILE}
+
+JMAP_DUMP_OPT="-dump:format=b,file=${DUMPFILE}"
+
+${JAVA} ${JAVA_OPTS} heapdump.share.EatMemory -metaspace -exec "${JMAP} ${JMAP_DUMP_OPT} %p"
+
+status=$?
+
+if [ $status -ne 0 ]; then
+        fail "Java exited with exit status: $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: ${DUMPFILE}"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/JMapMetaspaceCore.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk, quarantine]
+ * VM testbase comments: JDK-8023376 JDK-8001227 JDK-8051445
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies that heap dump created by jhsdb is able to be
+ *     parsed by HprofParser. It fills metaspace with classes till OutOfMemoryError,
+ *     forces core dump, then uses jhsdb one core file to create heap dump
+ *     and then verifies created heap dump with HprofParser.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/JMapMetaspaceCore/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,90 @@
+#!/bin/sh
+#
+# Copyright (c) 2014, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit -XX:MaxMetaspaceSize=64m -XX:-TransmitErrorReport"
+
+if [ $CORE_SUPPORTED -eq 0 ]; then
+        pass "Core dump is not supported"
+fi
+
+DUMPFILE=heap.bin
+
+rm -f ${DUMPFILE}
+
+ulimit -c unlimited || true
+
+echo "Below 'Unexpected error' is actually expected - JVM is forced to dump core"
+
+${JAVA} ${JAVA_OPTS} heapdump.share.EatMemory -metaspace -core &
+
+pid=$!
+
+wait $pid
+
+status=$?
+
+if [ $status -eq 0 ]; then
+        pass "Java exited with exit status: $status"
+fi
+
+for CORE in core* /cores/core.$pid; do
+        [ -e "$CORE" ] && break;
+done
+
+if [ ! -f "$CORE" ]; then
+        fail "Java exited with exit status $status, but core file was not created"
+fi
+
+echo "Found core file: $CORE"
+
+JMAP_DUMP_OPT="--binaryheap --dumpfile=${DUMPFILE}"
+EXE_OPT="--exe"
+CORE_OPT="--core"
+JHSDB_OPT="jmap"
+
+${JHSDB} ${JHSDB_OPT} ${JMAP_DUMP_OPT} ${EXE_OPT} ${JAVA} ${CORE_OPT} ${CORE}
+
+status=$?
+if [ $status -ne 0 ]; then
+        fail "jmap exited with exit status $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: $DUMPFILE"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+if [ "$TEST_CLEANUP" != "false" ]; then
+        rm -f ${CORE}
+        rm -f hs_err_pid*
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/OnOOMToFile.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk, quick]
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies -XX:+HeapDumpOnOutOfMemory VM option. It
+ *     fills the heap with objects of different types till OutOfMemoryError
+ *     and then verifies created heap dump with HprofParser.
+ * COMMENTS
+ *     This test uses -XX:HeapDumpPath= option pointing to file.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFile/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Copyright (c) 2007, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit"
+
+DUMPFILE=${DUMPBASE}/java.hprof
+
+rm -f ${DUMPFILE}
+
+JAVA_OPTS="${JAVA_OPTS} -Xmx`get_max_heap_size $JAVA_OPTS`"
+
+${JAVA} ${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DUMPFILE} heapdump.share.EatMemory
+
+status=$?
+
+if [ $status -ne 0 ]; then
+        fail "Java command exited with exit status $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: ${DUMPFILE}"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/OnOOMToFileMetaspace.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk, quick]
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies -XX:+HeapDumpOnOutOfMemory VM option. It fills
+ *     metaspace with classes till OutOfMemoryError is thrown and then
+ *     verifies create heap dump with HprofParser.
+ * COMMENTS
+ *     This test uses -XX:HeapDumpPath= option pointing to file.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToFileMetaspace/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Copyright (c) 2014, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit -XX:MaxMetaspaceSize=64m"
+
+DUMPFILE=${DUMPBASE}/java.hprof
+
+rm -f ${DUMPFILE}
+
+JAVA_OPTS="${JAVA_OPTS} -Xmx`get_max_heap_size $JAVA_OPTS`"
+
+${JAVA} ${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DUMPFILE} heapdump.share.EatMemory -metaspace
+
+status=$?
+
+if [ $status -ne 0 ]; then
+        fail "Java command exited with exit status $status"
+fi
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: ${DUMPFILE}"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/TEST.properties	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2017, 2018, 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.
+#
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/TestDescription.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2017, 2018, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM testbase heapdump/OnOOMToPath.
+ * VM testbase keywords: [heapdump, feature_heapdump, nonconcurrent, jdk, quick]
+ * VM testbase readme:
+ * DESCRIPTION
+ *     This test verifies -XX:+HeapDumpOnOutOfMemory VM option. It
+ *     fills the heap with objects of different types till OutOfMemoryError
+ *     and then verifies created heap dump with HprofParser.
+ * COMMENTS
+ *     This test uses -XX:HeapDumpPath= option pointing to directory in which
+ *     heap dump file should be created.
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build jdk.test.lib.hprof.HprofParser
+ *        heapdump.share.EatMemory
+ * @run shell/timeout=300 run.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/OnOOMToPath/run.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# Copyright (c) 2007, 2018, 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.
+#
+
+. $TESTSRC/../share/common.sh
+
+JAVA_OPTS="${JAVA_OPTS} -XX:-UseGCOverheadLimit"
+
+DUMPPATH=${DUMPBASE}/dumps
+
+rm -rf ${DUMPPATH}
+
+mkdir -p ${DUMPPATH}
+
+JAVA_OPTS="${JAVA_OPTS} -Xmx`get_max_heap_size $JAVA_OPTS`"
+
+${JAVA} ${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DUMPPATH} heapdump.share.EatMemory
+
+status=$?
+
+if [ $status -ne 0 ]; then
+        fail "Java command exited with exit status $status"
+fi
+
+DUMPFILE=`ls ${DUMPPATH}/*`
+
+if [ ! -f "${DUMPFILE}" ]; then
+        fail "Dump file was not created: $DUMPPATH/\*"
+fi
+
+verify_heapdump ${DUMPFILE}
+
+if [ $? -ne 0 ]; then
+        fail "Verification of heap dump failed"
+fi
+
+pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/README	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,38 @@
+Copyright (c) 2007, 2018, 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.
+
+heapdump/JMapHeap
+    test for heapdump for jmap on live process
+heapdump/JMapHeapCore
+    test for heap for jmap on core file
+heapdump/JMapMetaspace
+    test for heapdump for jmap on live process, fills metaspace with classes
+heapdump/JMapMetaspaceCore
+    test for heap for jmap on core file, fills metaspace with classes
+heapdump/OnOOMToFile
+    test for -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath option
+    for file. This test fills heap with objects of different types.
+heapdump/OnOOMToFileMetaspace
+    the same test as OnOOMToFile, but it fills metaspace with classes
+heapdump/OnOOMToPath
+    the same test as OnOOMToFile for -XX:HeapDumpPath option that points to directory
+heapdump/OnOOMRun
+    test for -XX:OnOutOfMemoryError option
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/share/EatMemory.java	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 2007, 2018, 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.
+ */
+
+package heapdump.share;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Random;
+
+import vm.share.ProcessUtils;
+
+import java.util.LinkedList;
+
+import nsk.share.gc.gp.classload.GeneratedClassProducer;
+
+/**
+ * This test eats memory by generating random garbage.
+ * <p>
+ * This program can eat either heap or metaspace using
+ * interned strings depending on parameter metaspace. After this, it
+ * can also force JVM to show dump, dump core or execute some command.
+ * The following command line switches are supported:
+ * <p>
+ * "-sleepTime" time to sleep
+ * "-signal" show dump after OOM
+ * "-metaspace" eat metaspace
+ * "-core" dump core after OOM
+ * "-exec command" execute command after OOM
+ */
+public class EatMemory {
+    private long sleepTime;
+    private boolean signal;
+    private boolean metaspace;
+    private boolean core;
+    private String exec;
+    private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+    private long initialFactor = 50;
+    private long minChunk = 1000;
+    private long factor = 5;
+    private long chunk;
+    private Runtime runtime = Runtime.getRuntime();
+    private int n = 0;
+    private final int arrayExtraSize = 12;
+    private final int stringLength = 128;
+    private byte[] reserved = new byte[(int) (runtime.maxMemory() / 20)];
+    private List storage = new ArrayList();
+    private List strings = new ArrayList();
+
+    /**
+     * @param sleepTime time to sleep
+     * @param signal    true if need to force JVM to show dump (Ctrl-Break / Ctrl-/) after OOM
+     * @param metaspace true if need to eat metaspace
+     * @param core      true if need to force JVM to dump core
+     * @param exec      command to execute after OOM
+     */
+    public EatMemory(long sleepTime, boolean signal, boolean metaspace, boolean core, String exec) {
+        this.sleepTime = sleepTime;
+        this.signal = signal;
+        this.metaspace = metaspace;
+        this.core = core;
+        this.exec = exec;
+    }
+
+    private int getSize(long chunk, long factor) {
+        return (int) Math.min(Integer.MAX_VALUE, (chunk - arrayExtraSize) / factor);
+    }
+
+    private Object create(long chunk) {
+        switch (++n % 8) {
+            case 0:
+                return new byte[getSize(chunk, 1)];
+            case 1:
+                return new short[getSize(chunk, 2)];
+            case 2:
+                return new char[getSize(chunk, 2)];
+            case 3:
+                return new boolean[getSize(chunk, 1)];
+            case 4:
+                return new long[getSize(chunk, 8)];
+            case 5:
+                return new float[getSize(chunk, 4)];
+            case 6:
+                return new double[getSize(chunk, 8)];
+            case 7:
+                return new Object[getSize(chunk, 16)];
+            default:
+                // Should never happen
+                return null;
+        }
+    }
+
+
+    public void eatHeap() {
+        try {
+            int[][] arrays = new int[Integer.MAX_VALUE / 2][];
+            for (int i = 0; ; ++i) {
+                arrays[i] = new int[Integer.MAX_VALUE / 2];
+            }
+        } catch (OutOfMemoryError x) {
+            reserved = null;
+        }
+    }
+
+    public void eatMetaspace() {
+        try {
+            System.out.println("Starting eating metaspace...");
+            GeneratedClassProducer gp = new GeneratedClassProducer();
+            List<Class> lst = new LinkedList<Class>();
+            System.out.println("... Oh, so tasty!");
+            while (true) {
+                lst.add(gp.create(0));
+            }
+        } catch (OutOfMemoryError e) {
+        }
+    }
+
+    public void eatMemory() throws IOException {
+        if (metaspace)
+            eatMetaspace();
+        else
+            eatHeap();
+        reserved = null;
+    }
+
+    /**
+     * Sleep some time to give system time to process a signal, start
+     * process, etc.
+     */
+    private void sleepSome() {
+        try {
+            Thread.sleep(sleepTime);
+        } catch (InterruptedException e) {
+        }
+    }
+
+    /**
+     * Throws an exception if execution was not successful.
+     */
+    private void execute() throws IOException, InterruptedException {
+        int pid = ProcessUtils.getPid();
+        if (pid < 0) {
+            throw new RuntimeException("Negative pid " + pid + "; Failed to executed " + exec);
+        }
+        exec = exec.replaceAll("%p", Integer.toString(pid));
+        System.out.println("Executing " + exec);
+        Process process = Runtime.getRuntime().exec(exec);
+        sleepSome();
+        process.waitFor();
+        StringBuilder sb = copy(process.getInputStream(), System.out);
+        sb.append(copy(process.getErrorStream(), System.out));
+        if (process.exitValue() != 0) {
+            // trying provide as much informative failure string
+            // hoping, it will be the last line in the error stream...
+
+
+            String failureCause = "Unknown";
+            String allTheOutput = sb.toString();
+            String[] lines = allTheOutput.split(System.getProperty("line.separator"));
+
+            for (int i = lines.length - 1; i >= 0; i--) {
+                // Check that string is not empty
+                if (!lines[i].trim().equals("")) {
+                    failureCause = lines[i];
+                    break;
+                }
+            }
+            throw new RuntimeException(failureCause);
+        }
+    }
+
+    private StringBuilder copy(InputStream in, OutputStream out) throws IOException {
+        byte[] buff = new byte[1000];
+        StringBuilder sb = new StringBuilder();
+        while (in.available() != 0) {
+            n = in.read(buff, 0, buff.length);
+            out.write(buff, 0, n);
+            sb.append(new String(buff, 0, n));
+        }
+        return sb;
+    }
+
+    public void run() throws Exception {
+        eatMemory();
+        if (signal) {
+            ProcessUtils.sendCtrlBreak();
+            sleepSome();
+
+        }
+        if (exec != null) {
+            execute();
+        }
+        if (core) {
+            /*
+             * We try to dump core here.
+             * On Unix systems a signal is sent to the process. We need to wait some time
+             * to give time to process it. On Windows systems, core dump is not supported
+             * and we just do not do anything in this case.
+             */
+            boolean res = ProcessUtils.dumpCore();
+            if (res) {
+                sleepSome();
+                throw new RuntimeException("Signal sent, but core was not dumped");
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        long sleepTime = 5000;
+        boolean signal = false;
+        boolean metaspace = false;
+        boolean core = false;
+        String exec = null;
+        for (int i = 0; i < args.length; ++i) {
+            if (args[i].equalsIgnoreCase("-sleepTime")) {
+                if (++i < args.length) {
+                    long time = Long.parseLong(args[i]);
+                    if (time != 0)
+                        sleepTime = time;
+                } else
+                    throw new RuntimeException("Argument expected after -sleepTime");
+            }
+            if (args[i].equalsIgnoreCase("-signal"))
+                signal = true;
+            if (args[i].equalsIgnoreCase("-metaspace"))
+                metaspace = true;
+            if (args[i].equalsIgnoreCase("-core"))
+                core = true;
+            if (args[i].equalsIgnoreCase("-exec")) {
+                if (++i < args.length)
+                    exec = args[i];
+                else
+                    throw new RuntimeException("Argument expected after -exec");
+            }
+        }
+        new EatMemory(sleepTime, signal, metaspace, core, exec).run();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/heapdump/share/common.sh	Tue May 15 11:28:29 2018 -0700
@@ -0,0 +1,187 @@
+#!/bin/bash
+# Copyright (c) 2007, 2018, 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.
+
+# This script contains useful functions for testing heapdump
+# feature of VM.
+
+: ${JAVA:="$TESTJAVA/bin/java"}
+: ${JAVA_OPTS:="$TESTJAVAOPTS $TESTVMOPTS -cp $TESTCLASSPATH"}
+: ${CP:="$TESTCLASSPATH"}
+: ${TEST_CLEANUP:="false"}
+: ${JMAP:="$TESTJAVA/bin/jmap"}
+: ${JHSDB:="$TESTJAVA/bin/jhsdb"}
+
+export PATH=$PATH:$TESTNATIVEPATH
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TESTNATIVEPATH
+export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$TESTNATIVEPATH
+
+if [ -z "${JAVA}" ]; then
+        echo JAVA variable is not set.
+        exit 1
+fi
+
+if [ -n "${testWorkDir}" ]; then
+        cd ${testWorkDir}
+fi
+
+if [ -z "${DUMPBASE}" ]; then
+        DUMPBASE=.
+fi
+if [ -z "$DEBUGGER_JAVA_OPTS" ]; then
+        DEBUGGER_JAVA_OPTS="$JAVA_OPTS"
+fi
+
+CORE_SUPPORTED=1
+
+for opt in $DEBUGGER_JAVA_OPTS; do
+        case $opt in
+        -D*)
+                JMAP="$JMAP -J$opt"
+                ;;
+        esac
+done
+
+export CORE_SUPPORTED
+
+# Verify heap dump
+# This function starts HprofParser and looks for message "Server is ready."
+# in output, in which case heap dump is verified.
+verify_heapdump() {
+        filename=$1
+        shift
+        echo Verifying ${filename}
+        echo ${JAVA} -cp $CP jdk.test.lib.hprof.HprofParser ${filename}
+        ${JAVA} -cp $CP jdk.test.lib.hprof.HprofParser ${filename}
+}
+
+cleanup() {
+        result="$1"
+        if [ -n "$DUMPFILE" ]; then
+                if [ "$TEST_CLEANUP" != "false" ]; then
+                        rm -f "$DUMPFILE"
+                else
+                        gzip "$DUMPFILE" || true
+                fi
+        fi
+}
+
+fail() {
+        message="$1"
+        res=1
+        echo "$message"
+        echo "TEST FAILED"
+        cleanup $res
+        exit 1
+}
+
+pass() {
+        message="$1"
+        if [ -n "$message" ]; then
+                echo "$message"
+        fi
+        echo "TEST PASSED"
+        cleanup 0
+        exit 0
+}
+
+# Parse VM options that have size argument and return it's value in bytes.
+# Function applicable to -Xmn, -Xms, -Xms and all possible -XX: options.
+parse_heap_size() {
+    OPTION=$1
+    SIZE=0
+    MULTIPLIER=0
+
+    # On Solaris sed don't support '+' quantificator, so <smth><smth>* is used.
+    # There is no support for '?' too, so <smth>* is used instead.
+    # Generally speaking, there sed on Solaris support only basic REs.
+    case "$OPTION" in
+        -Xm*)
+            SIZE=`echo $OPTION | sed -e 's#-Xm[xns]\([0-9][0-9]*\).*#\1#'`
+            MULTIPLIER=`echo $OPTION | sed -e 's#-Xm[xns][0-9][0-9]*\([kKmMgG]*\)#\1#'`
+            ;;
+        -XX*)
+            SIZE=`echo $OPTION | sed -e 's#[^=][^=]*=\([0-9][0-9]*\).*#\1#'`
+            MULTIPLIER=`echo $OPTION | sed -e 's#[^=][^=]*=[0-9][0-9]*\([kKmMgG]*\)#\1#'`
+            ;;
+    esac
+
+    case "$MULTIPLIER" in
+        k|K)
+            SIZE=$(( SIZE * 1024 ))
+            ;;
+        m|M)
+            SIZE=$(( SIZE * 1024 * 1024 ))
+            ;;
+        g|G)
+            SIZE=$(( SIZE * 1024 * 1024 * 1024 ))
+            ;;
+    esac
+
+    echo $SIZE
+}
+
+# Derivate max heap size from passed option list.
+get_max_heap_size() {
+    MaxHeapSize=
+    InitialHeapSize=
+    MaxNewSize=
+    NewSize=
+    OldSize=
+
+    for OPTION in "$@"; do
+        case "$OPTION" in
+            -Xmx*|-XX:MaxHeapSize=*)
+                MaxHeapSize=`parse_heap_size $OPTION`
+                ;;
+            -Xms*|-XX:InitialHeapSize=*)
+                InitialHeapSize=`parse_heap_size $OPTION`
+                ;;
+            -Xmn*|-XX:MaxNewSize=*)
+                MaxNewSize=`parse_heap_size $OPTION`
+                ;;
+            -XX:NewSize=*)
+                NewSize=`parse_heap_size $OPTION`
+                ;;
+            -XX:OldSize=*)
+                OldSize=`parse_heap_size $OPTION`
+                ;;
+        esac
+    done
+
+    if [ -n "$MaxHeapSize" ]; then
+        echo "$MaxHeapSize"
+    elif [ -n "$InitialHeapSize" ]; then
+        echo "$InitialHeapSize"
+    elif [ -n "$MaxNewSize" -a -n "$OldSize" ]; then
+        echo $(( MaxHeapSize + OldSize ))
+    elif [ -n "$NewSize" -a -n "$OldSize" ]; then
+        echo $(( 2 * NewSize + OldSize ))
+    elif [ -n "$OldSize" ]; then
+        echo $(( 2 * OldSize ))
+    elif [ -n "$MaxNewSize" ]; then
+        echo $(( 2 * MaxNewSize ))
+    elif [ -n "$NewSize" ]; then
+        echo $(( 3 * NewSize ))
+    else
+        echo "128M"
+    fi
+}