8199257: [TESTBUG] Open source VM testbase metaspace tests
authormseledtsov
Tue, 22 May 2018 13:05:22 -0700
changeset 50223 28a33a0dbf04
parent 50222 911b913022ef
child 50224 67066e7971e1
8199257: [TESTBUG] Open source VM testbase metaspace tests Summary: Open sourced VM metaspace tests Reviewed-by: coleenp, stuefe
test/hotspot/jtreg/ProblemList.txt
test/hotspot/jtreg/TEST.groups
test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/maxMetaspaceSize.java
test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/maxMetaspaceSize.sh
test/hotspot/jtreg/vmTestbase/metaspace/gc/Fault.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/FirstGCTest.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/MemoryUsageTest.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/MetaspaceBaseGC.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_10m/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_10m/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_50m/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_50m/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_99m/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_99m/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_default/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_default/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeComp/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeComp/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeMeta/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeMeta/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallComp/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallComp/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallMeta/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallMeta/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/readme.txt
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_0_1/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_0_1/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_10_20/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_10_20/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_70_80/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_70_80/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_99_100/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_99_100/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowMultiJVM/ShrinkGrowMultiJVM.java
test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowMultiJVM/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowTest/ShrinkGrowTest.java
test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/OneUsageClassloader.java
test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java
test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/ClassloaderUnderTest.java
test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/StressDictionary.java
test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/GenClassesBuilder.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/HumongousClassGen.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy1.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy2.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy3.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/StressClassloader.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/tree/Node.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/tree/Tree.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/ClassNotUnloadedException.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/GotWrongOOMEException.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/TimeIsOverException.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/GenerateHierarchyHelper.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/NodeDescriptor.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/TreeDescriptor.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy001/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy001/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy002/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy002/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy003/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy003/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy004/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy004/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy005/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy005/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy006/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy006/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy007/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy007/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy008/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy008/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy009/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy009/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy010/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy010/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy011/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy011/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy012/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy012/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy013/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy013/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy014/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy014/TestDescription.java
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy015/TEST.properties
test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy015/TestDescription.java
--- a/test/hotspot/jtreg/ProblemList.txt	Tue May 22 14:49:39 2018 -0400
+++ b/test/hotspot/jtreg/ProblemList.txt	Tue May 22 13:05:22 2018 -0700
@@ -123,6 +123,11 @@
 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/metaspace/gc/firstGC_10m/TestDescription.java 8160008 generic-all
+vmTestbase/metaspace/gc/firstGC_50m/TestDescription.java 8160008 generic-all
+vmTestbase/metaspace/gc/firstGC_99m/TestDescription.java 8160008 generic-all
+vmTestbase/metaspace/gc/firstGC_default/TestDescription.java 8160008 generic-all
+
 vmTestbase/gc/lock/jni/jnilock002/TestDescription.java 8191869,8192647 generic-all
 
 vmTestbase/vm/mlvm/indy/func/jdi/breakpointOtherStratum/Test.java 8199578 generic-all
--- a/test/hotspot/jtreg/TEST.groups	Tue May 22 14:49:39 2018 -0400
+++ b/test/hotspot/jtreg/TEST.groups	Tue May 22 13:05:22 2018 -0700
@@ -1157,6 +1157,9 @@
   vmTestbase/nsk/jdi/StackFrame/getArgumentValues/getArgumentValues002/getArgumentValues002.java \
   vmTestbase/nsk/jdi/StackFrame/getArgumentValues/getArgumentValues003/getArgumentValues003.java
 
+vmTestbase_vm_metaspace = \
+  vmTestbase/metaspace
+
 vmTestbase_nsk_stress = \
   vmTestbase/nsk/stress
 
@@ -1252,7 +1255,15 @@
   vmTestbase/gc/gctests/LoadUnloadGC \
   vmTestbase/gc/gctests/LoadUnloadGC2 \
   vmTestbase/gc/memory/LargePagesTest \
-  vmTestbase/gc/memory/Nio
+  vmTestbase/gc/memory/Nio \
+  vmTestbase/metaspace/staticReferences/StaticReferences.java \
+  vmTestbase/metaspace/stressDictionary/StressDictionary.java \
+  vmTestbase/metaspace/stressHierarchy/stressHierarchy001/TestDescription.java \
+  vmTestbase/metaspace/stressHierarchy/stressHierarchy011/TestDescription.java \
+  vmTestbase/metaspace/flags/maxMetaspaceSize/TestDescription.java \
+  vmTestbase/metaspace/shrink_grow/ShrinkGrowTest/ShrinkGrowTest.java \
+  vmTestbase/metaspace/shrink_grow/ShrinkGrowMultiJVM/ShrinkGrowMultiJVM.java \
+  vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize/TestDescription.java
 
 # JSR292 tests (invokedynamic AKA Multi-Language VM AKA Da Vinci Machine)
 vmTestbase_vm_mlvm = \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,35 @@
+/*
+ * 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 metaspace/flags/maxMetaspaceSize.
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build metaspace.flags.maxMetaspaceSize.maxMetaspaceSize
+ * @run shell maxMetaspaceSize.sh
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/maxMetaspaceSize.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013, 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 test set up -XX:MaxMetaspaceSize option and try to to generate OOME
+ * in metaspace. It also could crash with OOM. This is expected behavior.
+ */
+package metaspace.flags.maxMetaspaceSize;
+
+import nsk.share.gc.GC;
+import nsk.share.gc.GCTestBase;
+import nsk.share.gc.gp.*;
+import nsk.share.gc.gp.classload.GeneratedClassProducer;
+import nsk.share.test.Stresser;
+import nsk.share.TestFailure;
+
+public class maxMetaspaceSize extends GCTestBase {
+    @Override
+    public void run() {
+        Stresser stresser = new Stresser(runParams.getStressOptions());
+        GeneratedClassProducer garbageProducer = new GeneratedClassProducer();
+        int numOOM = 0;
+        stresser.start(0);
+        numOOM = GarbageUtils.eatMemory(stresser, garbageProducer, 50, 100, 2, GarbageUtils.OOM_TYPE.METASPACE);
+        if ((numOOM == 0) && (stresser.continueExecution())) {
+            throw new TestFailure("java.lang.OutOfMemoryError: Metadata space. Exception was not thrown.");
+        } else {
+            log.info("java.lang.OutOfMemoryError: Metadata space. Was thrown test passed.");
+        }
+    }
+
+    public static void main (String[] args) {
+        GC.runTest(new maxMetaspaceSize(), args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/flags/maxMetaspaceSize/maxMetaspaceSize.sh	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,45 @@
+# Copyright (c) 2013, 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.
+
+JAVA="$TESTJAVA/bin/java"
+JAVA_OPTS="$TESTJAVAOPTS $TESTVMOPTS -cp $TESTCLASSPATH"
+
+TST="metaspace.flags.maxMetaspaceSize.maxMetaspaceSize"
+echo ""
+echo "$JAVA $JAVA_OPTS -XX:MaxMetaspaceSize=100m $TST"
+echo ""
+$JAVA $JAVA_OPTS -XX:MaxMetaspaceSize=100m $TST
+res=$?
+
+printf "\n\n"
+if [ $res -eq 0 ]; then
+        echo Test passed
+else
+        grep -s "Out of Memory Error" hs_err_pid*.log
+        res2=$?
+        if [ $res2 -eq 0 ]; then
+            echo JAVA crashed with expected Out of Memory Error error.
+            echo Test passed
+        else
+            echo Test failed
+            exit 1
+        fi
+fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/Fault.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.gc;
+
+/**
+ * Exception signaling a test failure.
+ */
+public class Fault extends RuntimeException {
+
+    public Fault(String message) {
+        super(message);
+    }
+
+    public Fault(Throwable t) {
+        super(t);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/FirstGCTest.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.gc;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import static metaspace.gc.MetaspaceBaseGC.PAGE_SIZE;
+
+/**
+ * Test for metaspace GC
+ *
+ * <ul>
+ * <li>MetaspaceSize
+ * </ul>
+ * Test checks that the first GC happens when metaspace committed is next to
+ * MetaspaceSize value.
+ *
+ * Based on actual events (JDK 8 GC tuning document)
+ *
+ * Quating: Java SE 8 HotSpot[tm] Virtual Machine Garbage Collection Tuning
+ * <pre>
+ * Class metadata is deallocated when the corresponding Java class is unloaded.
+ * Java classes are unloaded as a results of garbage collection and garbage
+ * collections may be induced in order to unload classes and deallocate class
+ * metadata. When the space used for class metadata reaches a certain level
+ * (call it a high-water mark), a garbage collection is induced.
+ *
+ * The flag MetaspaceSize can be set higher to avoid early garbage collections
+ * induced for class metadata. The amount of class metadata allocated for
+ * an application is application dependent and general guidelines do not
+ * exist for the selection of MetaspaceSize. The default size of MetaspaceSize
+ * is platform dependent and ranges from 12 MB to about 20 MB.
+ * </pre>
+ */
+public class FirstGCTest extends MetaspaceBaseGC {
+     /**
+      * Current amount of the used metaspace
+      */
+     protected long used = 0;
+
+     /**
+      * Current amount of the committed metaspace
+      */
+     protected long committed = 0;
+
+     /**
+      * Previous amount of the used metaspace
+      */
+     protected long p_used = 0 ;
+
+     /**
+      * Previous amount of the committed metaspace
+      */
+     protected long p_committed = 0;
+
+    public static void main(String... args) {
+        new FirstGCTest().run(args);
+    }
+
+    // value given in -XX:metaspaceSize=<value>
+    private long metaspaceSize = -1;
+
+
+    @Override
+    protected void parseArgs(String[] args) {
+        final String XXSize = "-XX:MetaspaceSize=";
+        for (String va: vmArgs) {
+            if (va.startsWith(XXSize)) {
+                metaspaceSize = parseValue(va.substring(XXSize.length()));
+            }
+        }
+    }
+
+    @Override
+    protected String getPoolName() {
+        return "Metaspace";
+    }
+
+    /**
+     * Check for the first GC moment.
+     *
+     * Eats memory until GC is invoked (amount of used metaspace became less);
+     * Checks that committed memory is close to MemaspaceSize.
+     * Eats memory until the second GC to check min/max ratio options have effect.
+     */
+    @Override
+    public void doCheck() {
+        int gcCount = super.getMetaspaceGCCount();
+        if (gcCount == 0) {
+            // gc hasn't happened yet. Start loading classes.
+            boolean gcHappened = this.eatMemoryUntilGC(50000);
+            if (!gcHappened) {
+                throw new Fault("GC hasn't happened");
+            }
+            System.out.println("% GC: " + super.lastGCLogLine());
+            System.out.println("%   used     : " + p_used + " --> " + used);
+            System.out.println("%   committed: " + p_committed + " --> " + committed);
+            checkCommitted(p_committed);
+        } else {
+            // everything has happened before
+            checkCommitted(detectCommittedFromGCLog());
+        }
+    }
+
+    /**
+     * Check that committed amount is close to expected value (MetaspaceSize)
+     *
+     * @param committedAmount - value to check
+     */
+    void checkCommitted(long committedAmount) {
+        if (metaspaceSize > 0) {
+            // -XX:MetaspaceSize is given
+            if (Math.abs((int) (metaspaceSize - committedAmount)) < PAGE_SIZE) {
+                System.out.println("% GC happened at the right moment");
+                return;
+            }
+            if (!isMetaspaceGC()) {
+                System.out.println("% GC wasn't induced by metaspace, cannot check the moment :(");
+                return;
+            }
+            System.err.println("%## GC happened at the wrong moment, "
+                    + "the amount of committed space significantly differs "
+                    + "from the expected amount");
+            System.err.println("%## Real    : " + committedAmount);
+            System.err.println("%## Exepcted: " + metaspaceSize);
+            throw new Fault("GC happened at the wrong moment");
+        } else {
+            // -XX:MetaspaceSize is not given, check for default values
+            if (11_500_000 < committedAmount && committedAmount < 22_500_000) {
+                System.out.println("% GC happened when the committed amout was from 12 MB to about 20 MB.");
+                return;
+            }
+            if (!isMetaspaceGC()) {
+                System.out.println("% GC wasn't induced by metaspace, this is excuse");
+                return;
+            }
+            System.err.println("%## GC happened at the wrong moment, "
+                    + "the amount of committed space was expected from 12 MB to about 20 MB");
+            System.err.println("%## Real    : " + committedAmount);
+            throw new Fault("It was the wrong moment when GC happened");
+        }
+    }
+
+    /**
+     * Load new classes without keeping references to them trying to provoke GC.
+     * Stops if GC is detected, or number of attempts exceeds the given limit.
+     *
+     * @param times limit of attempts to provoke GC
+     * @return true if GC has happened, false if limit has exceeded.
+     */
+    protected boolean eatMemoryUntilGC(int times) {
+        System.out.println("%%%% Loading classes");
+        System.out.println("% iter#  :   used  : commited");
+        System.out.println("..............................");
+        for (int i = 1; i < times; i++) {
+            loadNewClasses(1, false);
+            if (i % 1000 == 0) {
+                printMemoryUsage("%  " + i + "  ");
+            }
+            p_used      = used;
+            p_committed = committed;
+            used = getUsed();
+            committed = getCommitted();
+
+            if (used < p_used) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * If the first full GC has already happened we will try to detect
+     * the committed amount from the gc.log file.
+     *
+     * @return committed amount detected
+     * @throws Fault if failed to detect.
+     */
+    protected long detectCommittedFromGCLog() {
+        // parse gc.log to extract the committed value from string like:
+        //  Metaspace       used 10133K, capacity 10190K, committed 10240K, reserved 10240Kl
+        System.out.println("%%%% Parsing gc log to detect the moment of the first GC");
+        String format = ".*Metaspace.* used .*, capacity .*, committed (\\d+)([KMGkmg]), reserved .*";
+        Pattern p = Pattern.compile(format);
+        try {
+            for (String line: readGCLog()) {
+                Matcher m = p.matcher(line);
+                if (m.matches()) {
+                    int amount = Integer.parseInt(m.group(1));
+                    int multi = 1;
+                    switch (m.group(2).toLowerCase()) {
+                        case "k": multi = 1024; break;
+                        case "m": multi = 1024*1024; break;
+                        case "g": multi = 1024*1024*1024; break;
+                    }
+                    long value = amount * multi;
+                    System.out.println("% Committed detected: " + value);
+                    return value;
+                }
+            }
+        } catch (IOException e) {
+            throw new Fault("Cannot read from the GC log");
+        }
+        System.out.println("% String that matches pattern '" + format + "' not found in the GC log file.");
+        throw new Fault("Unable to detect the moment of GC from log file");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.gc;
+
+import java.util.Arrays;
+import vm.share.VMRuntimeEnvUtils;
+
+/**
+ * Test metaspace ergonomic.
+ *
+ * <ul>
+ * <li>MetaspaceSize
+ * <li>MaxMetaspaceSize
+ * <li>MinMetaspaceFreeRatio
+ * <li>MaxMetaspaceFreeRatio
+ * </ul>
+ *
+ * The test loads classes until the committed metaspace achieves the certain
+ * level between MetaspaceSize and MaxMetaspaceSize.
+ * Then it counts how many times GC has been induced.
+ * Test verifies that MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio settings
+ * affect the frequency of GC. (High-water mark)
+ *
+ * Note: The test doesn't check the GC count if CMS is used.
+ *
+ * Quoting: Java SE 8 HotSpot[tm] Virtual Machine Garbage Collection Tuning
+ * <pre>
+ * Class metadata is deallocated when the corresponding Java class is unloaded.
+ * Java classes are unloaded as a results of garbage collection and garbage
+ * collections may be induced in order to unload classes and deallocate class
+ * metadata. When the space used for class metadata reaches a certain level
+ * (call it a high-water mark), a garbage collection is induced.
+ * After the garbage collection the high-water mark may be raised or lowered
+ * depending on the amount of space freed from class metadata. The high-water
+ * mark would be raised so as not to induce another garbage collection too soon.
+ * The high-water mark is initially set to the value of the command-line
+ * flag MetaspaceSize . It is raised or lowered based on the flags
+ * MaxMetaspaceFreeRatio and MinMetaspaceFreeRatio.
+ * If the committed space available for class metadata as a percentage of
+ * the total committed space for class metadata is greater than
+ * MaxMetaspaceFreeRatio, the high-water mark will be lowered.
+ * If it is less than MinMetaspaceFreeRatio, the high-water mark will be raised.
+ * </pre>
+ */
+public class HighWaterMarkTest extends FirstGCTest {
+
+    public static void main(String... args) {
+        new HighWaterMarkTest().run(args);
+    }
+
+    // value given in -XX:MetaspaceSize=<value>
+    private long metaspaceSize = -1;
+
+    // value given in -XX:MaxMetaspaceSize=<value>
+    private long maxMetaspaceSize = -1;
+
+    // value given in -XX:MinMetaspaceFreeRatio=<value>
+    private long minMetaspaceFreeRatio = -1;
+
+    // value given in -XX:MaxMetaspaceFreeRatio=<value>
+    private long maxMetaspaceFreeRatio = -1;
+
+    /**
+     * Parses arguments and vm options.
+     * Throws Fault in cases of wrong values or missed parameters.
+     *
+     * @param args command line options
+     */
+    @Override
+    protected void parseArgs(String[] args) {
+        if (args.length > 0) {
+            printUsage();
+            throw new Fault("Illegal arguments: " + Arrays.asList(args));
+        }
+
+        if (gclogFileName == null) {
+            printUsage();
+            throw new Fault("Log file name is not given");
+        }
+
+        final String metaSize    = "-XX:MetaspaceSize=";
+        final String maxMetaSize = "-XX:MaxMetaspaceSize=";
+        final String minRatio    = "-XX:MinMetaspaceFreeRatio=";
+        final String maxRatio    = "-XX:MaxMetaspaceFreeRatio=";
+
+        for (String va: vmArgs) {
+            if (va.startsWith(metaSize)) {
+                metaspaceSize = parseValue(va.substring(metaSize.length()));
+            } else if (va.startsWith(maxMetaSize)) {
+                maxMetaspaceSize = parseValue(va.substring(maxMetaSize.length()));
+            } else if (va.startsWith(minRatio)) {
+                minMetaspaceFreeRatio = parseValue(va.substring(minRatio.length()));
+            } else if (va.startsWith(maxRatio)) {
+                maxMetaspaceFreeRatio = parseValue(va.substring(maxRatio.length()));
+            }
+        }
+
+        if (metaspaceSize < 0) {
+            printUsage();
+            throw new Fault("-XX:MetaspaceSize is not specified");
+        } else if (maxMetaspaceSize < 0) {
+            printUsage();
+            throw new Fault("-XX:MaxMetaspaceSize is not specified");
+        } else if (minMetaspaceFreeRatio < 0) {
+            printUsage();
+            throw new Fault("-XX:MinMetaspaceFreeRatio is not specified");
+        } else if (maxMetaspaceFreeRatio < 0) {
+            printUsage();
+            throw new Fault("-XX:MaxMetaspaceFreeRatio is not specified");
+        }
+
+    }
+
+    private void printUsage() {
+        System.err.println("Usage: ");
+        System.err.println("java [-Xlog:gc:<filename>] [-XX:MetaspaceSize=..] [-XX:MaxMetaspaceSize=..] [-XX:MinMetaspaceFreeRatio=..] [-XX:MaxMetaspaceFreeRatio=..] \\");
+        System.err.println("    " + HighWaterMarkTest.class.getCanonicalName());
+    }
+
+    /**
+     * Check that MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio settings
+     * affects the moment of the next GC.
+     *
+     * Eats memory until amount of committed metaspace achieves a certain level
+     * (between MetaspaceSize and MaxMetaspaceSize).
+     * Then checks how many times GC has been invoked.
+     *
+     */
+    @Override
+    public void doCheck() {
+
+        // to avoid timeouts we limit the number of attempts
+        int attempts = 0;
+        int maxAttempts = 10_000;
+
+        // in between metaspaceSize and maxMetaspaceSize
+        // no OOM is exepcted.
+        long committedLevel = (metaspaceSize + maxMetaspaceSize) / 2;
+
+        while (getCommitted() < committedLevel && attempts < maxAttempts) {
+            attempts++;
+            loadNewClasses(9, true);  // load classes and keep references
+            loadNewClasses(1, false); // load classes without keeping references
+        }
+
+
+        System.out.println("% Classes loaded: " + attempts*10);
+        System.out.println("% Used metaspace    : " + bytes2k(getUsed()));
+        System.out.println("% Committed metaspce: " + bytes2k(getCommitted()));
+
+        cleanLoadedClasses();
+
+        if (attempts == maxAttempts) {
+            throw new Fault("Committed amount hasn't achieved " + bytes2k(committedLevel));
+        }
+
+        if (VMRuntimeEnvUtils.isVMOptionEnabled("UseConcMarkSweepGC")) {
+            System.out.println("ConcMarkSweep is used, cannot count GC");
+            return;
+        }
+
+        int gcCount = getMetaspaceGCCount();
+        if (gcCount < 0) {
+            // perhpas, it's better to silently pass here... Let's see.
+            throw new Fault ("Unable to count full collections, could be an env issue");
+        }
+        System.out.println("% GC has been invoked: " + gcCount + " times");
+
+        if (VMRuntimeEnvUtils.isVMOptionEnabled("UseG1GC") &&
+              VMRuntimeEnvUtils.isVMOptionEnabled("ClassUnloadingWithConcurrentMark")) {
+            System.out.println("% isG1ClassUnloading: true");
+            if (gcCount != 0) {
+                throw new Fault ("G1 should unload classes, full GC is not expected");
+            }
+        } else {
+            if (maxMetaspaceFreeRatio <= 1) {
+                // min/max = 0/1  boundary value
+                // GC should happen very often
+                checkGCCount(gcCount, 20, -1);
+            } else if (minMetaspaceFreeRatio >= 99) {
+                // min/max = 99/100  boundary value
+                // GC should happen very rare
+                checkGCCount(gcCount, -1, 2);
+            } else if (minMetaspaceFreeRatio >= 10  && maxMetaspaceFreeRatio <= 20) {
+                // GC should happen quite often
+                checkGCCount(gcCount, 3, 30);
+            } else if (minMetaspaceFreeRatio >= 70  && maxMetaspaceFreeRatio <= 80) {
+                // GC should happen quite often
+                checkGCCount(gcCount, 1, 3);
+            } else {
+                // hard to estimate
+            }
+        }
+
+    }
+    /**
+     * Checks that count of GC fits the expected range.
+     * Throws Fault if count is unexpected.
+     *
+     * @param count how many times GC has happened
+     * @param min   expected minimum, if under zero - undefined
+     * @param max   expected maximum, if under zero - undefined
+     */
+    void checkGCCount(int count, int min, int max) {
+        if (min < 0) {
+            if(count > max) {
+                throw new Fault("GC has happened too often: " + count + " times, " +
+                        "expected count: less than " + max);
+            }
+        } else if (max < 0) {
+            if(count < min) {
+                throw new Fault("GC has happened too rare: " + count + " times, " +
+                        "expected count greater than " + min);
+            }
+        } else if (count < min || count > max ) {
+            throw new Fault ("GC has happened " + count + " times, " +
+                    "approximate count is " + min + " to " + max);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/MemoryUsageTest.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.gc;
+
+/**
+ * Test observers the progress on used/committed memory.
+ * MemoryPoolMXBean is used for that purpose.
+ *
+ * Depending on command line option the test checks either Metaspace or
+ * Compressed Class Space area.
+ *
+ * This test checks two things:
+ * 1) Loading/Unloading classes doesn't cause memory increase
+ * 2) Loading classes causes permanent increase of memory.
+ */
+public class MemoryUsageTest extends MetaspaceBaseGC {
+
+    private String pool_name;
+
+    public static void main(String[] args) {
+        new MemoryUsageTest().run(args);
+    }
+
+
+
+    /**
+     * Loads new classes by bunches and invokes GC after each bunch.
+     * Expected behavior: used/committed should stop growing after 5 iterations.
+     */
+    public void checkForNotGrowing() {
+
+        long p_used = 0;
+        long p_committed = 0;
+
+        System.out.println("%%%% Loading classes without storing refs, invoking gc manually");
+        final int numberOfIteration = 10;
+        for (int i = 0; i < numberOfIteration; i++) {
+            loadNewClasses(500, false);
+            gc();
+            printMemoryUsage("% " + i + "  ");
+            if (i == numberOfIteration / 2) {
+                // used/committed in the middle of the step.
+                p_used = getUsed();
+                p_committed = getCommitted();
+            }
+
+        }
+        long used = getUsed();
+        long committed = getCommitted();
+
+        // loading classes without keeping references to them
+        // should not affect used/commited metaspace
+        // but OK, let's allow some noise such as +/-8K
+        if (Math.abs((int) (used - p_used)) > 1024*8) {
+            throw new Fault("Used amount should be stable: " +
+                    p_used + " --> " + used);
+        }
+        if (Math.abs((int) (committed - p_committed)) > 1024*8) {
+            throw new Fault("Committed amount should be stable: " +
+                    p_committed + " --> " + committed);
+        }
+
+    }
+
+    /**
+     * Loads new classes by bunches and invokes GC after each bunch.
+     * Expected behavior: used/committed should keep growing
+     */
+    public void checkForGrowing() {
+        long used = 0;
+        long committed = 0;
+        long p_used = 0 ;
+        long p_committed = 0;
+
+        // loading new classes, starting to keep references.
+        // both used and commited metaspace should grow up.
+        System.out.println("%%%% Loading classes, refs are stored, gc is invoking manually");
+        for (int i = 0; i < 10; i++) {
+            try {
+                loadNewClasses(1000, true);
+            } catch (OutOfMemoryError oom) {
+                String message = oom.getMessage().toLowerCase();
+                if (message.contains("metaspace") || message.contains("compressed class space")) {
+                     System.out.println("% oom is ok: " + oom);
+                     return;
+                } else {
+                     System.err.println("% unexpected OOM" + oom);
+                     throw new Fault(oom);
+                }
+            }
+
+            gc();
+            printMemoryUsage("% " + i + "  ");
+            p_used      = used;
+            p_committed = committed;
+            used = getUsed();
+            committed = getCommitted();
+            if (i > 0 && used <= p_used) {
+                throw new Fault("Used amount reduced unexpectedly " +
+                        p_used + " --> " + used);
+            }
+            if (i > 0 && committed < p_committed) {
+                throw new Fault("Used amount reduced unexpectedly " +
+                        p_committed + " --> " + committed);
+            }
+        }
+    }
+
+    /**
+     * Looks up for memory pool name.
+     * @param args command line options
+     */
+    @Override
+    protected void parseArgs(String[] args) {
+        if (args.length != 1) {
+            printUsage();
+            throw new Fault("MemoryPool is not specified");
+        }
+
+        String a = args[0];
+        if (a.equalsIgnoreCase("-pool:compressed")) {
+             pool_name = "Compressed Class Space";
+        } else if (a.equalsIgnoreCase("-pool:metaspace")) {
+             pool_name = "Metaspace";
+        } else {
+            printUsage();
+            throw new Fault("Unrecongnized argument: " + a);
+        }
+    }
+
+    private void printUsage() {
+        System.err.println("Usage: ");
+        System.err.println("java [-Xms..] [-XX:MetaspaceSize=..]  [-XX:MaxMetaspaceSize=..] \\");
+        System.err.println("    " + MemoryUsageTest.class.getCanonicalName() + " -pool:<metaspace|compressed>");
+    }
+
+    /**
+     * @return name of the MemoryPoolMXBean under test
+     */
+    @Override
+    protected String getPoolName() {
+        return pool_name;
+    }
+
+    @Override
+    protected void doCheck() {
+        checkForNotGrowing();
+        checkForGrowing();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/MetaspaceBaseGC.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.gc;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryPoolMXBean;
+import java.lang.management.MemoryUsage;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import jdk.internal.misc.Unsafe;
+
+/**
+ * Test that checks how GC works with Metaspace and "Compared Class Space".
+ *
+ * It comprises 3 test cases:
+ * <ul>
+ * <li>testcase1 - checks that used/committed memory doesn't grow
+ * when gc is invoked</li>
+ * <li>testcase2 - checks that gc is invoked when the class metadata  u
+ * sage reaches MetaspaceSize</li>
+ * <li>testcase3 - checks used/committed grow, inspite of gc is invoked</li>
+ * </ul>
+ *
+ * It's supposed that this class will be executed with various setting of VM
+ * flags. Via execute args it's possible to say which test cases to run and
+ * what space to test: Metaspace or Compared Class Space.
+ */
+public abstract class MetaspaceBaseGC {
+
+    // storage of loaded classes
+    private final Map<String, MetaspaceBaseGC.Foo> loadedClasses = new HashMap<>();
+    private static int counter = 0;
+
+    // pool to test
+    protected MemoryPoolMXBean pool = null;
+
+    // memory page size
+    protected static final long PAGE_SIZE = detectPageSize();
+
+    // true when PAGE_SIZE is large and
+    protected boolean useLargepages = false;
+
+    // where the log will be saved
+    protected String gclogFileName = null;
+
+    protected final Set<String> vmArgs = new HashSet<>();
+
+    protected abstract void parseArgs(String args[]);
+    protected abstract String getPoolName();
+    protected abstract void doCheck();
+
+    public final void run(String args[]) {
+        configure(args);
+        if (pool == null) {
+            System.out.println("%%% Cannot pull the pool, most likely 32-bits only");
+            return;
+        }
+        System.out.println("%%% Working with " + getPoolName());
+        for (String vmA: vmArgs) {
+            if (vmA.contains("Metaspace") || vmA.contains("Compressed")) {
+                System.out.println("%  " + vmA);
+            }
+        }
+        doCheck();
+        System.out.println("% Test passed.");
+    }
+
+
+    protected void configure(String args[]) {
+        vmArgs.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments());
+        useLargepages = PAGE_SIZE > 1_000_000 && !vmArgs.contains("-XX:-UseLargePagesInMetaspace");
+
+        System.out.println(vmArgs);
+
+        pool = getMemoryPool(getPoolName());
+        if (pool == null) {
+            return; // nothing to check
+        }
+        for (String arg: vmArgs) {
+            if (arg.startsWith("-Xlog:gc") && arg.length() > 8) {
+               gclogFileName = arg.substring(arg.lastIndexOf(':') + 1);
+            }
+        }
+        parseArgs(args);
+    }
+
+
+    /**
+     * Imitates class loading.
+     * Each invocation of this method causes a new class loader object is created
+     * and a new class is loaded by this class loader.
+     * Method throws OOM when run out of memory.
+     *
+     * @param times how many classes to load
+     * @param keepRefs true, if references to created classes should be stored
+     */
+    protected void loadNewClasses(int times, boolean keepRefs) {
+        for (int i = 0; i < times; i++) {
+            try {
+                String jarUrl = "file:" + counter + ".jar";
+                counter++;
+                URL[] urls = new URL[]{new URL(jarUrl)};
+                URLClassLoader cl = new URLClassLoader(urls);
+                MetaspaceBaseGC.Foo foo = (MetaspaceBaseGC.Foo) Proxy.newProxyInstance(cl,
+                        new Class[]{MetaspaceBaseGC.Foo.class},
+                        new MetaspaceBaseGC.FooInvocationHandler(new MetaspaceBaseGC.FooBar()));
+                if (keepRefs) {
+                    loadedClasses.put(jarUrl, foo);
+                }
+            } catch (java.net.MalformedURLException badThing) {
+                // should never occur
+                System.err.println("Unexpeted error: " + badThing);
+                throw new RuntimeException(badThing);
+            }
+        }
+
+    }
+
+    /**
+     * Cleans references to loaded classes.
+     */
+    protected void cleanLoadedClasses() {
+        loadedClasses.clear();
+    }
+
+    /**
+     * Invokes System.gc() and sleeps a little.
+     */
+    protected void gc() {
+        System.gc();
+        try {
+            Thread.currentThread().sleep(500);
+        } catch (Exception whatever) {
+        }
+    }
+
+    /**
+     * Reads gc.log file and returns it as a list of lines.
+     * It's supposed that the test is executed with -Xlog:gc:gc.log option.
+     *
+     * @return List of strings the gc.log file is comprised.
+     * @throws IOException if problem occurred while reading.
+     */
+    protected List<String> readGCLog() throws IOException {
+        return Files.readAllLines(Paths.get(".", gclogFileName));
+    }
+
+    /**
+     * Reads gc.log file and counts GC induced by metaspace.
+     * Note: this method doesn't work for ConcMarkSweep...
+     * @return how many times GC induced by metaspace has occurred.
+     */
+    protected int getMetaspaceGCCount() {
+        int count = 0;
+        try {
+            for (String line: readGCLog()) {
+                if (line.indexOf("Pause Full") > 0 && line.indexOf("Meta") > 0) {
+                    count++;
+                }
+            }
+            return count;
+        } catch (Throwable t) {
+            t.printStackTrace(System.err);
+            return -1;
+        }
+    }
+
+    protected String lastGCLogLine() {
+        if (gclogFileName == null) {
+            return "";
+        }
+        try {
+            List<String> list = Files.readAllLines(Paths.get(".", gclogFileName));
+            return list.get(list.size() - 1);
+        } catch (IOException e) {
+            return "File not found";
+        }
+    }
+
+    /**
+     * Does it best to checks if the last GC was caused by metaspace.
+     *
+     * This method looks into gc.log file (if -Xloggc:file is given) and returns
+     * true if the last line in the log contains the "Metadata" word.
+     * It's not very reliable way to check, log might not be flushed yet.
+     *
+     * @return
+     */
+    protected boolean isMetaspaceGC() {
+        return lastGCLogLine().contains("Metadata");
+    }
+
+    /**
+     * Prints amounts of used and committed metaspace preceeded by the message
+     * @param mesg a message to printed prior usages
+     */
+    protected void printMemoryUsage(String mesg) {
+        MemoryUsage mu = pool.getUsage();
+        printMemoryUsage(mesg, mu.getUsed(), mu.getCommitted());
+    }
+    protected void printMemoryUsage(String mesg, long v1, long v2) {
+        System.out.println(mesg + ": " + bytes2k(v1) + "   :   " + bytes2k(v2));
+    }
+    protected String bytes2k(long v) {
+        return (v / 1024) + "k";
+    }
+
+
+
+    /**
+     * @return amount of used memory
+     */
+    public long getUsed() {
+        return pool.getUsage().getUsed();
+    }
+
+    /**
+     * @return amount of committed memory
+     */
+    public long getCommitted() {
+        return pool.getUsage().getCommitted();
+    }
+
+    private static MemoryPoolMXBean getMemoryPool(String name) {
+        List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
+        for (MemoryPoolMXBean pool : pools) {
+            if (pool.getName().equals(name)) {
+                return pool;
+            }
+        }
+        return null;
+    }
+
+    private static long detectPageSize() {
+        try {
+            Unsafe unsafe = Unsafe.getUnsafe();
+
+            int pageSize = unsafe.pageSize();
+            System.out.println("Page size: " + pageSize);
+            return pageSize;
+        } catch (Exception e) {
+            throw new Fault("Cannot detect page size");
+        }
+    }
+
+
+    long parseValue(String s) {
+        s = s.toLowerCase();
+        int multiplier = 1;
+        switch (s.charAt(s.length() - 1)) {
+            case 'g': multiplier = 1024*1024*1024; break;
+            case 'm': multiplier = 1024*1024; break;
+            case 'k': multiplier = 1024; break;
+        }
+        if (multiplier == 1) {
+            return Long.parseLong(s);
+        } else {
+            return Long.parseLong(s.substring(0, s.length() - 1)) * multiplier;
+        }
+    }
+
+    public static interface Foo {
+    }
+
+    public static class FooBar implements Foo {
+    }
+
+    class FooInvocationHandler implements InvocationHandler {
+        private final Foo foo;
+
+        FooInvocationHandler(MetaspaceBaseGC.Foo foo) {
+            this.foo = foo;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            return method.invoke(foo, args);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_10m/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_10m/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/firstGC_10m.
+ * VM Testbase keywords: [nonconcurrent, quarantine]
+ * VM Testbase comments: JDK-8160008
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -Xlog:gc+heap=trace,gc:gc.log
+ *      -XX:MetaspaceSize=10m
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:-VerifyBeforeExit
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.FirstGCTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_50m/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_50m/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/firstGC_50m.
+ * VM Testbase keywords: [nonconcurrent, quarantine]
+ * VM Testbase comments: JDK-8160008
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -Xlog:gc+heap=trace,gc:gc.log
+ *      -XX:MetaspaceSize=50m
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:-VerifyBeforeExit
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.FirstGCTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_99m/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_99m/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/firstGC_99m.
+ * VM Testbase keywords: [nonconcurrent, quarantine]
+ * VM Testbase comments: JDK-8160008
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -Xlog:gc+heap=trace,gc:gc.log
+ *      -XX:MetaspaceSize=99m
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:-VerifyBeforeExit
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.FirstGCTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_default/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/firstGC_default/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,44 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/firstGC_default.
+ * VM Testbase keywords: [nonconcurrent, quarantine]
+ * VM Testbase comments: JDK-8160008
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -Xlog:gc+heap=trace,gc:gc.log
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:-VerifyBeforeExit
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.FirstGCTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeComp/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeComp/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,42 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/memoryUsageLargeComp.
+ * VM Testbase keywords: [nonconcurrent]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -XX:MetaspaceSize=100m
+ *      -XX:MinMetaspaceFreeRatio=90
+ *      -XX:MaxMetaspaceFreeRatio=99
+ *      metaspace.gc.MemoryUsageTest
+ *      -pool:compressed
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeMeta/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageLargeMeta/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,42 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/memoryUsageLargeMeta.
+ * VM Testbase keywords: [nonconcurrent]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xms200m
+ *      -XX:MetaspaceSize=100m
+ *      -XX:MinMetaspaceFreeRatio=1
+ *      -XX:MaxMetaspaceFreeRatio=10
+ *      metaspace.gc.MemoryUsageTest
+ *      -pool:metaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallComp/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallComp/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,41 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/memoryUsageSmallComp.
+ * VM Testbase keywords: [nonconcurrent]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=20M
+ *      -XX:MinMetaspaceFreeRatio=10
+ *      -XX:MaxMetaspaceFreeRatio=30
+ *      metaspace.gc.MemoryUsageTest
+ *      -pool:compressed
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallMeta/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/memoryUsageSmallMeta/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,41 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/memoryUsageSmallMeta.
+ * VM Testbase keywords: [nonconcurrent]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -XX:MetaspaceSize=10M
+ *      -XX:MinMetaspaceFreeRatio=70
+ *      -XX:MaxMetaspaceFreeRatio=90
+ *      metaspace.gc.MemoryUsageTest
+ *      -pool:metaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/readme.txt	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+ Copyright (c) 2013, 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.
+
+
+
+metaspace/gc tests - are the test for the Metaspace GC tuning, which is described in the
+Java SE 8 HotSpot[tm] Virtual Machine Garbage  Collection Tuning
+
+Tests load classes and monitor the used/committed amounts of metaspace.
+There are three types of tests all extending base class - MetaspaceBaseGC
+
+MemoryUsageTest -
+  trivial test to check memory dynamic (loading classes should lead to growth
+  of used memory, gc to reduce)
+
+FirstGCTest -
+  loads classes until the GC has happened and check the GC has happened at the
+  right moment (as stated in the Spec)
+
+HighWaterMarkTest
+  The test loads classes until the committed metaspace achieves the certain
+  level between MetaspaceSize and MaxMetaspaceSize.
+  Then it counts how many times GC has been induced.
+  Test verifies that MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio settings
+  affect the frequency of GC. (High-water mark)
+
+Note: GC could be caused not by Metaspace. When GC happens, the tests check
+gc.log file to find the reason of GC. Tests will pass if there is no guarantee
+that GC was induced by metaspace.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_0_1/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_0_1/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/watermark_0_1.
+ * VM Testbase keywords: [nonconcurrent, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xmx1g
+ *      -Xms150m
+ *      -Xlog:gc:gc.log
+ *      -XX:MetaspaceSize=5m
+ *      -XX:MaxMetaspaceSize=25m
+ *      -XX:MinMetaspaceFreeRatio=0
+ *      -XX:MaxMetaspaceFreeRatio=1
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.HighWaterMarkTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_10_20/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_10_20/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/watermark_10_20.
+ * VM Testbase keywords: [nonconcurrent, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xmx1g
+ *      -Xms150m
+ *      -Xlog:gc:gc.log
+ *      -XX:MetaspaceSize=5m
+ *      -XX:MaxMetaspaceSize=25m
+ *      -XX:MinMetaspaceFreeRatio=10
+ *      -XX:MaxMetaspaceFreeRatio=20
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.HighWaterMarkTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_70_80/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_70_80/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/watermark_70_80.
+ * VM Testbase keywords: [nonconcurrent, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xmx1g
+ *      -Xms150m
+ *      -Xlog:gc:gc.log
+ *      -XX:MetaspaceSize=5m
+ *      -XX:MaxMetaspaceSize=25m
+ *      -XX:MinMetaspaceFreeRatio=70
+ *      -XX:MaxMetaspaceFreeRatio=80
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.HighWaterMarkTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_99_100/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/watermark_99_100/TestDescription.java	Tue May 22 13:05:22 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/gc/watermark_99_100.
+ * VM Testbase keywords: [nonconcurrent, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -Xmx1g
+ *      -Xms150m
+ *      -Xlog:gc:gc.log
+ *      -XX:MetaspaceSize=5m
+ *      -XX:MaxMetaspaceSize=25m
+ *      -XX:MinMetaspaceFreeRatio=99
+ *      -XX:MaxMetaspaceFreeRatio=100
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:-UseCompressedOops
+ *      metaspace.gc.HighWaterMarkTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,41 @@
+/*
+ * 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 metaspace/shrink_grow/CompressedClassSpaceSize.
+ * VM Testbase keywords: [monitoring, quarantine]
+ * VM Testbase comments: JDK-8058967
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -DrequiresCompressedClassSpace=true
+ *      -XX:MaxMetaspaceSize=100m
+ *      -XX:CompressedClassSpaceSize=10m
+ *      -Xlog:gc*:gc.log
+ *      metaspace.shrink_grow.ShrinkGrowTest.ShrinkGrowTest
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowMultiJVM/ShrinkGrowMultiJVM.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2013, 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 metaspace/shrink_grow/ShrinkGrowMultiJVM.
+ * VM Testbase keywords: [nonconcurrent]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build metaspace.shrink_grow.ShrinkGrowMultiJVM.ShrinkGrowMultiJVM
+ * @run driver metaspace.shrink_grow.ShrinkGrowMultiJVM.ShrinkGrowMultiJVM
+ */
+
+package metaspace.shrink_grow.ShrinkGrowMultiJVM;
+
+import jdk.test.lib.Utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This test starts several JVMs and run ShrinkGrow metaspace test.
+ *
+ * It expected that all the parameters on start new processes are given
+ * in the command line.
+ */
+public class ShrinkGrowMultiJVM {
+    private static final String[] TEST_ARGS = {
+            Paths.get(Utils.TEST_JDK)
+                 .resolve("bin")
+                 .resolve("java")
+                 .toAbsolutePath()
+                 .toString(),
+            "-Xlog:gc:gc_$i.log", // LOG_GC_ARG_INDEX
+            "-XX:MetaspaceSize=10m",
+            "-XX:MaxMetaspaceSize=20m",
+            "-cp",
+            Utils.TEST_CLASS_PATH
+    };
+    private static final int LOG_GC_ARG_INDEX = 1;
+    public static void main(String argv[]) {
+        String[] testJavaOpts = Utils.getTestJavaOpts();
+        String[] args = new String[TEST_ARGS.length + testJavaOpts.length + 2];
+        System.arraycopy(TEST_ARGS, 0, args, 0, TEST_ARGS.length);
+        System.arraycopy(testJavaOpts, 0, args, TEST_ARGS.length, testJavaOpts.length);
+        args[args.length - 2] = metaspace.shrink_grow.ShrinkGrowTest.ShrinkGrowTest.class.getCanonicalName();
+        args[args.length - 1] = "jvm#$i";
+
+        for (int i = 0; i < args.length; ++i) {
+            System.out.println("%arg #" + i + ": " + args[i]);
+        }
+
+        List<Process> list = new ArrayList<>();
+        for (int i = 0; i < 5; i++) {
+            // will be used as jvm id
+            args[args.length - 1] = "jvm#" + i;
+            args[LOG_GC_ARG_INDEX] = "-Xlog:gc:gc_" + i + ".log";
+            ProcessBuilder pb = new ProcessBuilder(args);
+            try {
+                Process p = pb.start();
+                // Redirect.INHERIT doesn't work w/ @run driver
+                new Thread(() -> copy(p.getInputStream(), System.out)).start();
+                new Thread(() -> copy(p.getErrorStream(), System.out)).start();
+                list.add(p);
+                System.out.println("=== process #" + i + " started");
+            } catch (IOException e) {
+                throw new Error("Failed to start process " + i, e);
+            }
+        }
+        int failedCount = 0;
+        for (int i = 0; i < list.size(); i++) {
+            Process p = list.get(i);
+            try {
+                int exitCode = p.waitFor();
+                if (exitCode != 0) {
+                    failedCount++;
+                    System.out.println("=== process #" + i + " exitCode=" + exitCode);
+                }
+            } catch (InterruptedException e) {
+                failedCount++;
+                System.out.println("=== process #" + i + " waitFor failed");
+                e.printStackTrace(System.out);
+            }
+        }
+        if (failedCount != 0) {
+            throw new AssertionError(failedCount + " out of " + list.size() + " tests failed");
+        }
+    }
+
+    private static void copy(InputStream is, OutputStream os) {
+        byte[] buffer = new byte[1024];
+        int n;
+        try (InputStream close = is) {
+            while ((n = is.read(buffer)) != -1) {
+                os.write(buffer, 0, n);
+            }
+            os.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowMultiJVM/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/shrink_grow/ShrinkGrowTest/ShrinkGrowTest.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2013, 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 metaspace/shrink_grow/ShrinkGrowTest.
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm
+ *      -XX:MetaspaceSize=10m
+ *      -XX:MaxMetaspaceSize=20m
+ *      -Xlog:gc*:gc.log
+ *      metaspace.shrink_grow.ShrinkGrowTest.ShrinkGrowTest
+ */
+
+package metaspace.shrink_grow.ShrinkGrowTest;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryPoolMXBean;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the main test in the metaspace shrink/grow series.
+ *
+ * It tries to allocate all available metespace (loads new classes and keeps
+ * them in map), then checks that loading new classes causes OOM.
+ * After that it does cleanup loaded classes and then expect the new classes
+ * could be loaded again.
+ *
+ * <b>Note</b>: Don't forget to limit the metaspace size by giving
+ * -XX:MaxMetaspaceSize=100k vm option.
+ */
+public class ShrinkGrowTest {
+
+    /**
+     * Dead classes storage.
+     */
+    private final Map<String, ShrinkGrowTest.Foo> loadedClasses = new HashMap<>();
+
+    private static int counter = 0;
+
+    private String errorMessage = "not completed";
+
+     // thread id to distinguish threads in output
+    private final String whoAmI;
+
+    // the limit of classes to load expecting OOM
+    private final int maxClassesToLoad;
+
+    public static void main(String[] args) {
+        String name = args.length > 0 ? args[0] : "singleTest" ;
+        new ShrinkGrowTest(name, 20000).run();
+    }
+
+    /**
+     * @param name - thread id used in logging
+     * @param classesToLoad - the limit of classes to load expecting OOM
+     */
+    public ShrinkGrowTest(String name, int classesToLoad) {
+        whoAmI = name;
+        maxClassesToLoad = classesToLoad;
+
+    }
+
+    /**
+     * Just outputs given message preceeded with the thread identifier
+     *
+     * @param message text to print out
+     */
+    void log(String message) {
+        System.out.println("%" + whoAmI + "% " + message);
+    }
+
+    void throwFault(String message) {
+        throw new TestFault("%" + whoAmI + "% " + message);
+    }
+
+    void throwFault(String message, Throwable t) {
+        throw new TestFault("%" + whoAmI + "% " + message, t);
+    }
+
+    /**
+     * Entry to the test.
+     * Just exits if passes or throws an Error if failed.
+     */
+    public void run() {
+        if (System.getProperty("requiresCompressedClassSpace") != null &&
+                   !isCompressedClassSpaceAvailable()) {
+                System.out.println("Not applicalbe, Compressed Class Space is required");
+            return;
+        }
+
+        try {
+            log("Bootstrapping string concatenation for " + whoAmI );
+            go();
+            // The quest completed! Yahoo!
+            setErrorMessage(null);
+            log("passed");
+        } catch (TestFault failure) {
+            failure.printStackTrace(System.err);
+            setErrorMessage(failure.getMessage());
+            log("failed :" + errorMessage);
+            throw failure;
+        } catch (Throwable badThing) {
+            setErrorMessage(badThing.toString());
+            throw new TestFault(badThing);
+        }
+    }
+
+    private void go() {
+        // step 1: eat all metaspace
+        log("eating metaspace");
+        runOutOfMetaspace(maxClassesToLoad);
+
+        // step 2: try to load one more class
+        // it should be impossible
+        try {
+            eatALittleMemory();
+            throwFault("We haven't cleaned metaspace yet!");
+        } catch (OutOfMemoryError error) {
+            if (!isMetaspaceError(error)) {
+                throwFault("Hmm, we ran out metaspace. Metaspace error is still excpected here " + error, error);
+            }
+        }
+
+        // step 3: clean up metaspace and try loading a class again.
+        log("washing hands before meal");
+        loadedClasses.clear();
+        System.gc();
+        try {
+            log("one more try to eat");
+            eatALittleMemory();
+        } catch (OutOfMemoryError error) {
+            throwFault("we already should be able to consume metaspace " + error, error);
+        }
+    }
+
+    /**
+     * @return true if the test has successfully passed.
+     */
+    public boolean isPassed() {
+        return errorMessage == null;
+    }
+
+    /**
+     * @return message describing the reason of failure, or null if passes
+     */
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    /**
+     * Sets the message describing why test failed, or null if test passed
+     */
+    void setErrorMessage(String msg) {
+        errorMessage = msg;
+    }
+
+    /**
+     * Loads new classes until OOM.
+     * Checks that OOM is caused by metaspace and throws an Error if not.
+     *
+     * @param times - maximum limit of classes to load.
+     */
+    private void runOutOfMetaspace(int times) {
+        try {
+            for (int i = 0; i < times; i++) {
+                eatALittleMemory();
+            }
+        } catch (OutOfMemoryError error) {
+            if (isMetaspaceError(error)) {
+                return;
+            }
+            throwFault("We ran out of another space, not metaspace: " + error, error);
+        }
+        throwFault("OOM hasn't happened after " + times + " iterations. Might be too much space?..");
+    }
+
+    /**
+     * Imitates class loading.
+     * Each invocation of this method causes a new class loader object is created
+     * and a new class is loaded by this class loader.
+     * Method throws OOM when run out of memory.
+     */
+    private void eatALittleMemory() {
+        try {
+            String jarUrl = "file:" + counter + ".jar";
+            counter++;
+            URL[] urls = new URL[]{new URL(jarUrl)};
+            URLClassLoader cl = new URLClassLoader(urls);
+            ShrinkGrowTest.Foo foo = (ShrinkGrowTest.Foo) Proxy.newProxyInstance(cl,
+                    new Class[]{ShrinkGrowTest.Foo.class},
+                    new ShrinkGrowTest.FooInvocationHandler(new ShrinkGrowTest.FooBar()));
+            loadedClasses.put(jarUrl, foo);
+        } catch (java.net.MalformedURLException badThing) {
+            // should never occur
+            throwFault("Unexpeted error: " + badThing, badThing);
+        }
+
+    }
+
+    /**
+     * Checks if given OOM is about metaspace
+     * @param error OOM
+     * @return true if message contains 'metaspace' word, false otherwise.
+     */
+    boolean isMetaspaceError(OutOfMemoryError error) {
+            String message = error.getMessage();
+        return message != null && (message.contains("Metaspace") ||
+                        message.contains("Compressed class space"));
+    }
+
+    boolean isCompressedClassSpaceAvailable() {
+        for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {
+            if (pool.getName().equalsIgnoreCase("Compressed class space")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Runtime exception signaling test failure.
+     */
+    public static class TestFault extends RuntimeException {
+        public TestFault(String message) {
+            super(message);
+        }
+        public TestFault(Throwable t) {
+            super(t);
+        }
+        public TestFault(String message, Throwable t) {
+            super(message, t);
+        }
+    }
+
+    public static interface Foo {
+    }
+
+    public static class FooBar implements ShrinkGrowTest.Foo {
+    }
+
+    class FooInvocationHandler implements InvocationHandler {
+        private final ShrinkGrowTest.Foo foo;
+
+        FooInvocationHandler(ShrinkGrowTest.Foo foo) {
+            this.foo = foo;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            return method.invoke(foo, args);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/OneUsageClassloader.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.staticReferences;
+
+
+public class OneUsageClassloader extends ClassLoader {
+
+    public Class<?> define(byte[] bytecode) {
+        return defineClass(null, bytecode, 0 ,bytecode.length);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2013, 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
+ * @modules java.base/jdk.internal.misc:+open
+ *
+ * @summary converted from VM Testbase metaspace/staticReferences.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xmx800m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.staticReferences.StaticReferences
+ */
+
+package metaspace.staticReferences;
+
+import java.lang.ref.WeakReference;
+import java.lang.ref.Reference;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import vm.share.InMemoryJavaCompiler;
+import nsk.share.gc.GCTestBase;
+import nsk.share.test.ExecutionController;
+import nsk.share.test.Stresser;
+import nsk.share.test.TestBase;
+import nsk.share.test.Tests;
+import jdk.internal.misc.Unsafe;
+import vm.share.gc.TriggerUnloadingHelper;
+import vm.share.gc.TriggerUnloadingWithWhiteBox;
+
+/**
+ * Test checks that static fields will be initialized in new loaded class. Test performs in loop the following routine:
+ * 1.) Load class either by regular classloader or by Unsafe.defineAnonymousClass.
+ * 2.) Trigger unloading. Class must be alive. Next step will check that static fields would not lost.
+ * 3.) Change static fields.
+ * 4.) Unload class.
+ * 5.) Load class again as in step 1.
+ * 6.) Check that static fields were initialized.
+ */
+@SuppressWarnings("rawtypes")
+public class StaticReferences extends GCTestBase {
+
+    private static final int UNLOADING_ATTEMPTS_LIMIT = 50;
+
+    private static final Object[] NO_CP_PATCHES = new Object[0];
+
+    private static String[] args;
+
+    private static final int LIMIT = 100;
+
+    private List<Object> keepAlive = new LinkedList<Object>();
+
+    private Random random;
+
+    private TriggerUnloadingHelper triggerUnloadingHelper = new TriggerUnloadingWithWhiteBox();
+
+    private String[] typesArray = new String[] {"Object object", "boolean boolean", "byte byte", "char char", "double double", "float float", "int int", "long long", "short short"};
+
+    public static void main(String[] args) {
+        StaticReferences.args = args;
+        Tests.runTest(new StaticReferences(), args);
+    }
+
+    private static Unsafe getUnsafe() {
+        return Unsafe.getUnsafe();
+    }
+
+        @Override
+    public void run() {
+                random = new Random(runParams.getSeed());
+        ExecutionController stresser = new Stresser(args);
+        stresser.start(1);
+
+        // Generate and compile classes
+        List<byte[]> bytecodeList = new LinkedList<byte[]>();
+        int[] fieldQuantities = new int[9];
+        long startTimeStamp = System.currentTimeMillis();
+        for (int i = 0; i < LIMIT; i++) {
+            if (!stresser.continueExecution()) {
+                        return;
+                }
+            for (int j = 0; j < fieldQuantities.length; j++) {
+                fieldQuantities[j] = 1 + random.nextInt(2000);
+            }
+            bytecodeList.add(generateAndCompile(fieldQuantities));
+        }
+        log.info("Compilation finished in " + ((System.currentTimeMillis() - startTimeStamp)/1000/60.0) + " minutes ");
+
+        // Core of test
+        for (byte[] classBytecode : bytecodeList) {
+            boolean anonymous = random.nextBoolean();
+
+            log.info("Load class first time");
+            Class clazz = loadClass(classBytecode, anonymous);
+
+            log.info("Trigger unloading");
+            triggerUnloadingHelper.triggerUnloading(stresser);
+            if (!stresser.continueExecution()) {
+                        return;
+                }
+
+            log.info("Set up static fields. This will check that static fields are reachable.");
+            setupFields(clazz);
+
+            log.info("Cleanup references");
+            Reference<Class> weakReference = new WeakReference<Class>(clazz);
+            clazz = null;
+
+            log.info("Trigger unloading again");
+            int numberOfAttemps = 0;
+            while (weakReference.get() != null && numberOfAttemps < UNLOADING_ATTEMPTS_LIMIT) {
+                if (!stresser.continueExecution()) {
+                        return;
+                }
+                triggerUnloadingHelper.triggerUnloading(stresser);
+            }
+            if (numberOfAttemps >= UNLOADING_ATTEMPTS_LIMIT) {
+                setFailed(true);
+                throw new RuntimeException("Test failed: was unable to unload class with " + UNLOADING_ATTEMPTS_LIMIT + " attempts.");
+            }
+
+            log.info("Load class second time");
+            clazz = loadClass(classBytecode, anonymous);
+
+            log.info("check fields reinitialized");
+            checkStaticFields(clazz);
+
+            keepAlive.add(clazz);
+        }
+    }
+
+        private Class loadClass(byte[] classBytecode,
+                        boolean anonymous) {
+                Class clazz;
+                if (anonymous) {
+                        clazz = getUnsafe().defineAnonymousClass(StaticReferences.class, classBytecode, NO_CP_PATCHES);
+                } else {
+                        OneUsageClassloader classloader = new OneUsageClassloader();
+                        clazz = classloader.define(classBytecode);
+                }
+                return clazz;
+        }
+
+    private void checkStaticFields(Class clazz) {
+        for (Field field : clazz.getFields()) {
+            try {
+                if (Modifier.isStatic(field.getModifiers())) {
+                    Class fieldType = field.getType();
+                    if ((fieldType.equals(Object.class) && field.get(null) != null )
+                            || (fieldType.equals(int.class) && field.getInt(null) != 0)
+                            || (fieldType.equals(boolean.class) && field.getBoolean(null) != false)
+                            || (fieldType.equals(char.class) && field.getChar(null) != 0)
+                            || (fieldType.equals(long.class) && field.getLong(null) != 0)
+                            || (fieldType.equals(short.class) && field.getShort(null) != 0)
+                            || (fieldType.equals(float.class) && field.getFloat(null) != 0.0f)
+                            || (fieldType.equals(double.class) && field.getDouble(null) != 0.0)
+                            || (fieldType.equals(byte.class) && field.getByte(null) != 0)) {
+                        setFailed(true);
+                        throw new RuntimeException("Failing test: field "
+                                + field.getName() + " of type "
+                                + field.getType() + " in class "
+                                + field.getDeclaringClass().getName()
+                                + " was not cleared");
+                    }
+                }
+            } catch (IllegalArgumentException | IllegalAccessException e) {
+                e.printStackTrace();
+                throw new RuntimeException("Was unable to set static field "
+                        + field.getName() + " of type "
+                        + field.getType().getName() + " in class "
+                        + field.getDeclaringClass().getName(), e);
+            }
+        }
+    }
+
+    private byte[] generateAndCompile(int[] filedQuantities) {
+        Map<String, CharSequence> sources = new HashMap<String, CharSequence>();
+        sources.put("A", generateSource(filedQuantities));
+        return InMemoryJavaCompiler.compile(sources).values().iterator().next();
+    }
+
+    private StringBuffer generateSource(int[] fieldQuantities) {
+        StringBuffer result = new StringBuffer("public class A { \n");
+        int fieldsCounter = 0;
+        for (int i = 0; i < typesArray.length; i++) {
+            for (int j = 0; j < fieldQuantities[i]; j++) {
+                result.append(" public static " + typesArray[i] + fieldsCounter++ + ";\n");
+            }
+        }
+        result.append(" } ");
+        return result;
+    }
+
+    private void setupFields(Class clazz) {
+        for (Field field : clazz.getFields()) {
+            try {
+                if (Modifier.isStatic(field.getModifiers())) {
+                    Class fieldType = field.getType();
+                    if (fieldType.equals(Object.class)) {
+                        field.set(null, this);
+                    } else if (fieldType.equals(int.class)) {
+                        field.setInt(null, 42);
+                    } else if (fieldType.equals(boolean.class)) {
+                        field.setBoolean(null, true);
+                    } else if (fieldType.equals(char.class)) {
+                        field.setChar(null, 'c');
+                    } else if (fieldType.equals(long.class)) {
+                        field.setLong(null, (long) 42);
+                    } else if (fieldType.equals(short.class)) {
+                        field.setShort(null, (short) 42);
+                    } else if (fieldType.equals(float.class)) {
+                        field.setFloat(null, 42.42f);
+                    } else if (fieldType.equals(double.class)) {
+                        field.setDouble(null, 42.42);
+                    } else if (fieldType.equals(byte.class)) {
+                        field.setByte(null, (byte) 42);
+                    }
+                }
+            } catch (IllegalArgumentException | IllegalAccessException e) {
+                e.printStackTrace();
+                throw new RuntimeException(
+                        "Was unable to set static field " + field.getName()
+                                + " of type " + field.getType().getName()
+                                + " in class "
+                                + field.getDeclaringClass().getName(), e);
+            }
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/ClassloaderUnderTest.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressDictionary;
+
+public class ClassloaderUnderTest extends ClassLoader {
+
+    private static boolean isParallelCapable;
+
+    public static boolean isParallelCapableCL() { return isParallelCapable; }
+    {
+        isParallelCapable = registerAsParallelCapable();
+    }
+
+    public Class<?> define(byte[] bytecode) {
+        return defineClass(null, bytecode, 0 ,bytecode.length);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/StressDictionary.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2013, 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 metaspace/stressDictionary.
+ * VM Testbase keywords: [nonconcurrent, javac]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @run main/othervm metaspace.stressDictionary.StressDictionary
+ */
+
+package metaspace.stressDictionary;
+
+import java.util.*;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicLong;
+
+import nsk.share.gc.GCTestBase;
+import nsk.share.test.*;
+import vm.share.InMemoryJavaCompiler;
+
+/**
+ * There is a data structure named "dictionary" in class BlockFreelist. It stores
+ * information about free memory blocks for further reusing. Allocation of new block goes
+ * from dictionary only if dictionary is fat enough. (At the moment of test creation this limit is 64K.)
+ * So to stress dictionary we should fill it permanently. The easiest way to fill the dictionary
+ * is to fail class loading. This failed action will return allocated blocks to dictionary.
+ *
+ * There are two type of threads in this test: threads, failing classloading and threads,
+ * loading regular classes and checking they work properly.
+ */
+public class StressDictionary extends GCTestBase {
+
+    private class FillingDictionaryWorker implements Callable<Object> {
+        @Override
+        public Object call() throws Exception {
+            while (stresser.continueExecution()) {
+                try {
+                    byte[] bytecode = generateAndCompile();
+                    bytecode[random.nextInt(bytecode.length)] = (byte) 42;
+                    classloader.define(bytecode);
+                    changeClassloaderIfRequired();
+                } catch (Throwable e) {
+                    // We can get ClassFormatError, ClassNotFoundException or anything else here
+                }
+            }
+            return null;
+        }
+    }
+
+    private class RegularWorker implements Callable<Object> {
+        @Override
+        public Object call() throws Exception {
+            while (stresser.continueExecution()) {
+                byte[] bytecode = generateAndCompile();
+                Class<?> c = classloader.define(bytecode);
+                testClass(c);
+                changeClassloaderIfRequired();
+            }
+            return null;
+        }
+    }
+
+    private static String[] args;
+
+    private static final int DROP_CLASSLOADER_LIMIT = 50000;
+
+    private static final String methodName = "myMethod";
+
+    private static final int NUMBER_OF_CORRUPTING_THREADS = 10;
+
+    private static final int NUMBER_OF_METHOD_CALLS = 50;
+
+    private static final int NUMBER_OF_NOT_CORRUPTING_THREADS = 10;
+
+    private AtomicLong classesCounter = new AtomicLong(0);
+
+    private volatile ClassloaderUnderTest classloader = new ClassloaderUnderTest();
+
+    private Random random;
+
+    private ExecutionController stresser;
+
+    public static void main(String[] args) {
+        StressDictionary.args = args;
+        Tests.runTest(new StressDictionary(), args);
+    }
+
+    public void run() {
+        random = new Random(runParams.getSeed());
+        stresser = new Stresser(args);
+        stresser.start(1);
+        List<Callable<Object>> tasks = new LinkedList<Callable<Object>>();
+        for (int i = 0; i < NUMBER_OF_CORRUPTING_THREADS; i++) {
+            tasks.add(this.new FillingDictionaryWorker());
+        }
+        for (int i = 0; i < NUMBER_OF_NOT_CORRUPTING_THREADS; i++) {
+            tasks.add(this.new RegularWorker());
+        }
+        ExecutorService executorService = Executors.newCachedThreadPool();
+        try {
+            executorService.invokeAll(tasks);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void changeClassloaderIfRequired() {
+        if (ManagementFactory.getClassLoadingMXBean().getLoadedClassCount() > DROP_CLASSLOADER_LIMIT) {
+          ClassloaderUnderTest newOne = new ClassloaderUnderTest();
+          classloader = newOne;
+        }
+    }
+
+    private byte[] generateAndCompile() {
+        Map<String, CharSequence> sources = new HashMap<String, CharSequence>();
+        String className = "MyClass" + classesCounter.incrementAndGet();
+        sources.put(className, generateSource(className));
+        return InMemoryJavaCompiler.compile(sources).values().iterator().next();
+    }
+
+    private CharSequence generateSource(String className) {
+        return "public class " + className + " { " +
+                        "public static String s1 = \"s1" + random.nextInt() + "\"; " +
+                                        "public String s2 = \"s2" + random.nextInt() + "\"; " +
+                                        "public String " + methodName + "() {return s1 + s2; } " +
+                        "}";
+    }
+
+    private void testClass(Class<?> clazz) {
+        try {
+            for (Method m : clazz.getMethods()) {
+                if (m.getName().equals(methodName)) {
+                    for (int j = 0; j < NUMBER_OF_METHOD_CALLS; j++) {
+                        m.invoke(clazz.newInstance());
+                    }
+                }
+            }
+        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
+            log.error("Class check failed: " + e.getMessage());
+            e.printStackTrace();
+            setFailed(true);
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/GenClassesBuilder.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+package metaspace.stressHierarchy.common;
+
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.Utils;
+import jdk.test.lib.process.ProcessTools;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+public class GenClassesBuilder {
+    public static void main(String[] args) {
+        Path srcDst = Paths.get("genSrc").toAbsolutePath();
+        Path classesDir = Paths.get(Utils.TEST_CLASSES).toAbsolutePath();
+        generateSource(srcDst);
+        compileSource(srcDst, classesDir);
+    }
+
+    private static void compileSource(Path srcDst, Path classesDir) {
+        JDKToolLauncher javac = JDKToolLauncher.create("javac")
+                                               .addToolArg("-d")
+                                               .addToolArg(classesDir.toString())
+                                               .addToolArg("-cp")
+                                               .addToolArg(Utils.TEST_CLASS_PATH);
+        try (Stream<Path> stream = Files.walk(srcDst)) {
+            stream.map(Path::toAbsolutePath)
+                  .map(Path::toString)
+                  .filter(s -> s.endsWith(".java"))
+                  .forEach(javac::addToolArg);
+        } catch (IOException e) {
+            throw new Error("traverse source dir " + srcDst, e);
+        }
+        String[] command = javac.getCommand();
+        try {
+            ProcessTools.executeCommand(command)
+                        .shouldHaveExitValue(0);
+        } catch (Error | RuntimeException e) {
+            throw e;
+        } catch (Throwable e) {
+            throw new Error("execution of javac(" + Arrays.toString(command) + ") failed", e);
+        }
+    }
+
+    private static void generateSource(Path dir) {
+        try {
+            Files.createDirectories(dir);
+        } catch (IOException e) {
+            throw new Error("can't create dirs for" + dir, e);
+        }
+
+        try {
+            HumongousClassGen.main(new String[]{dir.toString()});
+        } catch (Exception e) {
+            throw new Error("can't generate classes", e);
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/HumongousClassGen.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2015, 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 metaspace.stressHierarchy.common;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *  This class is compiled and invoke due the build to produce
+ *  HumongousClass.java. The size of generated file is
+ *  too large to store it in the repository.
+ */
+
+public class HumongousClassGen {
+
+private static final String CLASS_NAME = "HumongousClass";
+private static final String PKG_NAME = "metaspace.stressHierarchy.common";
+private static final String PKG_DIR_NAME = PKG_NAME.replace(".",
+        File.separator);
+private static final int ITERATIONS = 65300;
+private static final double MG = (Math.pow(1024, 2));
+private static final int RECORD_COUNT = ITERATIONS + 10;
+
+public static void addFileHeader(List<String> records) {
+    records.add("package " + PKG_NAME + ";\n");
+    records.add("\n");
+    records.add("public class " + CLASS_NAME + " {\n");
+    records.add("\n");
+}
+
+public static void main(String[] args) throws Exception {
+    if (args.length < 1) {
+        System.out.println("Usage: HumongousClassGen "
+                        + "<vm-testbase_src_folder>");
+        throw new RuntimeException("Can't generate " + PKG_NAME + "." + CLASS_NAME);
+    }
+
+    List<String> records = new ArrayList<String>(RECORD_COUNT);
+    addFileHeader(records);
+    for (int i = 1; i <= ITERATIONS; i++) {
+        records.add("public long long" + i + ";\n");
+    }
+    records.add("}");
+    writeBuffered(records, (int) (MG * 1), args[0]);
+}
+
+private static void writeBuffered(List<String> records, int bufSize,
+        String srcDir) throws IOException {
+    String path = srcDir + File.separator + PKG_DIR_NAME + File.separator
+            + CLASS_NAME + ".java";
+    System.out.println("Path="+path);
+    File file = new File (path);
+    file.getParentFile().mkdirs();
+    file.createNewFile();
+    long start = System.currentTimeMillis();
+    FileWriter writer = new FileWriter(file);
+    BufferedWriter bufferedWriter = new BufferedWriter(writer, bufSize);
+
+    for (String record: records) {
+       bufferedWriter.write(record);
+    }
+    bufferedWriter.flush();
+    bufferedWriter.close();
+    long end = System.currentTimeMillis();
+    System.out.println((end - start) / 1000f + " seconds");
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.List;
+
+import metaspace.stressHierarchy.common.classloader.tree.Node;
+import metaspace.stressHierarchy.common.classloader.tree.Tree;
+import metaspace.stressHierarchy.common.exceptions.ClassNotUnloadedException;
+import metaspace.stressHierarchy.common.exceptions.TimeIsOverException;
+import nsk.share.test.ExecutionController;
+import sun.hotspot.WhiteBox;
+import vm.share.gc.TriggerUnloadingHelper;
+
+public class PerformChecksHelper {
+
+    private static final int NUMBER_OF_HOT_METHOD_CALLS = 100;
+
+    private static WhiteBox wb = WhiteBox.getWhiteBox();
+
+    // This is the number of failed attempts required to deem class unloading failed
+    private int attemptsLimit = 50;
+
+    // This is the pause between unloading attempts in milliseconds
+    private long unloadingPause = 1000;
+
+    // This is the number of failed attempts after that pauses will be involved
+    private int pausesLimit = 5;
+
+    private TriggerUnloadingHelper triggerUnloadingHelper = null;
+
+    private ExecutionController stresser;
+
+    public PerformChecksHelper(TriggerUnloadingHelper triggerUnloadingHelper, int attemptsLimit, long unloadingPause, int pausesLimit) {
+        this.triggerUnloadingHelper = triggerUnloadingHelper;
+        if (attemptsLimit != -1) {
+                this.attemptsLimit = attemptsLimit;
+        }
+        if (unloadingPause != -1) {
+                this.unloadingPause = unloadingPause;
+        }
+        if (pausesLimit != -1) {
+                this.pausesLimit = pausesLimit;
+        }
+        System.out.println("attemptsLimit = " + this.attemptsLimit);
+        System.out.println("unloadingPause = " + this.unloadingPause);
+        System.out.println("pausesLimit = " + this.pausesLimit);
+    }
+
+    public void checkLevelReclaimed(Tree tree, int level)
+            throws IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotUnloadedException, TimeIsOverException {
+        long attempsCounter = 0;
+        boolean checkPassed = false;
+        ClassNotUnloadedException classNotUnloadedException = null;
+        while (!checkPassed && attempsCounter++ < attemptsLimit) {
+            if (attempsCounter > pausesLimit && unloadingPause > 0) {
+                try {
+                    Thread.sleep(unloadingPause);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException("Somebody dared to interrupt thread while we were waiting after gc provoke");
+                }
+            }
+            try {
+                checkLevel(tree, level, false);
+                checkPassed = true;
+            } catch (ClassNotUnloadedException exception) {
+                checkPassed = false;
+                classNotUnloadedException = exception;
+                triggerUnloadingHelper.triggerUnloading(stresser);
+            }
+        }
+        if (!checkPassed) {
+            System.out.println("Going to throw classNotUnloadedException. attempsCounter = " + attempsCounter);
+            throw classNotUnloadedException;
+        }
+
+    }
+
+    public void checkLevelAlive(Tree tree, int level) throws IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotUnloadedException, TimeIsOverException {
+        checkLevel(tree, level, true);
+    }
+
+    private void checkLevel(Tree tree, int level, boolean shouldBeAlive)
+            throws IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotUnloadedException, TimeIsOverException {
+        for (Node node : tree.getNodesInLevel(level)) {
+            for (String className : node.getLoadedClassesNames()) {
+                checkStresser();
+                boolean isClassAlive = wb.isClassAlive(className);
+                if (isClassAlive != shouldBeAlive) {
+                    throw new ClassNotUnloadedException("Failing test! Class: " + className + " shouldBeAlive: " + shouldBeAlive
+                            + " isClassAlive: " + isClassAlive);
+                }
+            }
+        }
+        if (shouldBeAlive) {
+            checkAncestorsAlive(tree, level);
+        }
+    }
+
+    private void callMethods(Class<?> clazz)
+            throws IllegalAccessException, IllegalArgumentException,
+            InvocationTargetException, InstantiationException {
+        try {
+            for (Method m : clazz.getMethods()) {
+                for (int j = 0; j < NUMBER_OF_HOT_METHOD_CALLS; j++) {
+                    if (m.getName().equals("composeString")) {
+                        m.invoke(clazz.newInstance());
+                    } else if (m.getName().equals("calculate")) {
+                        m.invoke(clazz.newInstance());
+                    } else if (m.getName().equals("calculate2")) {
+                        m.invoke(clazz.newInstance());
+                    }
+                }
+            }
+        } catch (OutOfMemoryError e) {
+            if (e.getMessage().trim().toLowerCase().contains("metadata")) {
+                System.out.println("Got OOME in metaspace in PerformChecksHelper.callMethods(Class clazz). " +
+                                "This happened because reflection generates a too many accessors. " +
+                                "There is nothing we can do with it, so we are just suppressing.");
+            } else {
+                throw e;
+            }
+        }
+    }
+
+    private void checkAncestors(Class<?> clazz) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, TimeIsOverException {
+        for (; clazz != null; clazz = clazz.getSuperclass()) {
+            checkStresser();
+            if (!clazz.isInterface()) {
+                //check class
+                callMethods(clazz);
+            } else {
+                //check interface by implementing it
+                InvocationHandler handler = new InvocationHandler() {
+                    @Override
+                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                        return Integer.MIN_VALUE;
+                    }
+                };
+                Object instance = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] {clazz}, handler);
+                instance.hashCode();
+            }
+            if (!wb.isClassAlive(clazz.getName())) {
+                throw new RuntimeException("Test failed in method checkAncestors: class "
+                        + clazz.getName() + " should be alive");
+            }
+        }
+    }
+
+    private void checkAncestorsAlive(Tree tree, int level)
+            throws IllegalAccessException, InvocationTargetException,
+            InstantiationException, IllegalArgumentException, TimeIsOverException {
+        List<Node> bottomLevel = tree.getNodesInLevel(level);
+        if (bottomLevel.isEmpty()) {
+            throw new RuntimeException("Failing test because of test bug: no nodes in bottom level");
+        }
+        for (Node node : bottomLevel) {
+            if (node.getLoadedClasses() == null || node.getLoadedClasses().isEmpty()) {
+                throw new RuntimeException("Failing test because of test bug: no classes loaded by node " + node);
+            }
+            for (Class<?> clazz : node.getLoadedClasses()) {
+                checkAncestors(clazz);
+            }
+        }
+    }
+
+    public void setStresser(ExecutionController stresser) {
+        this.stresser = stresser;
+    }
+
+    private void checkStresser() throws TimeIsOverException {
+        if (stresser == null) {
+            throw new RuntimeException("Test bug. Wrong usage of PerformChecksHelper. Stresser was not set.");
+        }
+        if (!stresser.continueExecution()) {
+            throw new TimeIsOverException();
+        }
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy1.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common;
+
+import nsk.share.test.ExecutionController;
+import nsk.share.test.Tests;
+import metaspace.stressHierarchy.common.classloader.tree.Tree;
+
+/**
+ * Test checks that ancestors will not be reclaimed while references on descenders are alive.
+ * We create hierarchy of classes, each loaded by dedicated classloader. Then we cleanup
+ * references to all nodes except those that are in bottom level. Finally we check that classes
+ * in bottom level are alive.
+ */
+public class StressHierarchy1 extends StressHierarchyBaseClass {
+
+    public static void main(String[] args) {
+        try {
+            StressHierarchyBaseClass.args = args;
+            Tests.runTest(new StressHierarchy1(), args);
+        } catch (OutOfMemoryError error) {
+            System.out.print("Got OOME: " + error.getMessage());
+        }
+    }
+
+    @Override
+    protected void runTestLogic(Tree tree, ExecutionController stresser)
+            throws Throwable {
+
+        for (int cleanupLevel = tree.getMaxLevel() - 1; cleanupLevel > 1; cleanupLevel--) {
+            tree.cleanupLevel(cleanupLevel);
+            log.info("cleanupLevel=" + cleanupLevel);
+            triggerUnloadingHelper.triggerUnloading(stresser);
+            if (!stresser.continueExecution()) {
+                // pass test
+                return;
+            }
+        }
+
+        log.info("Check bottom level");
+        performChecksHelper.checkLevelAlive(tree, tree.getMaxLevel());
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy2.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common;
+
+import metaspace.stressHierarchy.common.classloader.tree.Tree;
+import metaspace.stressHierarchy.common.exceptions.ClassNotUnloadedException;
+import nsk.share.test.ExecutionController;
+import nsk.share.test.Tests;
+
+/**
+ * Test case checks that presence of ancestors does not prevent descenders of being reclaimed.
+ * We create hierarchy of classes, each loaded by dedicated classloader. Then we start the following
+ * routine in loop: release references to classes in bottom level, provoke unloading and check
+ *      1) that classes in bottom level were unloaded and
+ *      2) that next to bottom level was NOT unloaded.
+ */
+public class StressHierarchy2 extends StressHierarchyBaseClass {
+
+    public static void main(String[] args) {
+        try {
+            StressHierarchyBaseClass.args = args;
+            Tests.runTest(new StressHierarchy2(), args);
+        } catch (OutOfMemoryError error) {
+            System.out.print("Got OOME: " + error.getMessage());
+        }
+    }
+
+    @Override
+    protected void runTestLogic(Tree tree, ExecutionController stresser)
+            throws Throwable {
+
+        for (int cleanupLevel = tree.getMaxLevel(); cleanupLevel >= 0; cleanupLevel-- ) {
+            tree.cleanupLevel(cleanupLevel);
+            log.info("cleanupLevel=" + cleanupLevel);
+            triggerUnloadingHelper.triggerUnloading(stresser);
+            if (!stresser.continueExecution()) {
+                return;
+            }
+            if (cleanupLevel > 0) {
+                performChecksHelper.checkLevelAlive(tree, cleanupLevel - 1);
+            }
+            if (!stresser.continueExecution()) {
+                return;
+            }
+
+            try {
+                performChecksHelper.checkLevelReclaimed(tree, cleanupLevel);
+            } catch (ClassNotUnloadedException exception) {
+                log.error("Class was not unloaded." + exception.toString());
+                setFailed(true);
+                throw exception;
+            }
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchy3.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common;
+
+import metaspace.stressHierarchy.common.classloader.tree.Tree;
+import nsk.share.test.ExecutionController;
+import nsk.share.test.Tests;
+
+/**
+ * 1. Test case cleans up all levels except bottom, then checks that bottom level is alive (and whole tree).
+ * 2. Then test cleans up whole tree and checks that it is reclaimed.
+ */
+public class StressHierarchy3 extends StressHierarchyBaseClass {
+
+    public static void main(String[] args) {
+        try {
+            StressHierarchyBaseClass.args = args;
+            Tests.runTest(new StressHierarchy3(), args);
+        } catch (OutOfMemoryError error) {
+            System.out.print("Got OOME: " + error.getMessage());
+        }
+    }
+
+    @Override
+    protected void runTestLogic(Tree tree, ExecutionController stresser)
+            throws Throwable {
+
+        for (int cleanupLevel = tree.getMaxLevel() - 1; cleanupLevel >= 0; cleanupLevel--) {
+            if (! stresser.continueExecution()) { return; }
+            tree.cleanupLevel(cleanupLevel);
+            log.info("cleanupLevel=" + cleanupLevel);
+        }
+
+        triggerUnloadingHelper.triggerUnloading(stresser);
+
+        if (! stresser.continueExecution()) { return; }
+
+        log.info("Check bottom level alive ");
+        performChecksHelper.checkLevelAlive(tree, tree.getMaxLevel());
+
+        if (! stresser.continueExecution()) { return; }
+
+        log.info("Cleanup all");
+        tree.cleanupLevel(tree.getMaxLevel());
+
+        triggerUnloadingHelper.triggerUnloading(stresser);
+
+        log.info("Check bottom level reclaimed");
+        performChecksHelper.checkLevelReclaimed(tree, tree.getMaxLevel());
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common;
+
+import java.net.MalformedURLException;
+
+import vm.share.gc.TriggerUnloadingByFillingMetaspace;
+import vm.share.gc.TriggerUnloadingHelper;
+import vm.share.gc.TriggerUnloadingWithWhiteBox;
+
+import metaspace.stressHierarchy.common.classloader.tree.Node;
+import metaspace.stressHierarchy.common.classloader.tree.Tree;
+import metaspace.stressHierarchy.common.exceptions.GotWrongOOMEException;
+import metaspace.stressHierarchy.common.exceptions.TimeIsOverException;
+import metaspace.stressHierarchy.common.generateHierarchy.GenerateHierarchyHelper;
+import metaspace.stressHierarchy.common.generateHierarchy.GenerateHierarchyHelper.Type;
+import metaspace.stressHierarchy.common.generateHierarchy.NodeDescriptor;
+import metaspace.stressHierarchy.common.generateHierarchy.TreeDescriptor;
+import nsk.share.test.ExecutionController;
+import nsk.share.test.Stresser;
+import nsk.share.test.TestBase;
+import nsk.share.test.timeoutwatchdog.TimeoutHandler;
+import nsk.share.test.timeoutwatchdog.TimeoutWatchdog;
+
+
+/**
+ * Superclass for StressHierarchy* tests. It provides util methods to create and load
+ * classes hierarchy and perform checks.
+ */
+abstract public class StressHierarchyBaseClass extends TestBase implements TimeoutHandler {
+
+    protected static String[] args;
+
+    protected TriggerUnloadingHelper triggerUnloadingHelper = new TriggerUnloadingWithWhiteBox(); //default helper
+
+    protected PerformChecksHelper performChecksHelper = null;
+
+    private int treeDepth;
+
+    private int minLevelSize;
+
+    private int maxLevelSize;
+
+    private Type hierarchyType;
+
+    public void run() {
+        try {
+            int attemptsLimit = -1; // -1 means using default value defined in PerformChecksHelper
+            long unloadingPause = -1; // -1 means the same
+            int pausesLimit = -1; // -1 means the same
+
+            for (int ind = 0; ind < args.length; ind++ ) {
+                if ("-triggerUnloadingByFillingMetaspace".equals(args[ind])) {
+                    log.info("using TriggerUnloadingByFillingMetaspace");
+                    triggerUnloadingHelper = new TriggerUnloadingByFillingMetaspace();
+                } else if ("-treeDepth".equals(args[ind])) {
+                    this.treeDepth = Integer.parseInt(args[ind + 1]);
+                } else if ("-minLevelSize".equals(args[ind])) {
+                    this.minLevelSize = Integer.parseInt(args[ind + 1]);
+                } else if ("-maxLevelSize".equals(args[ind])) {
+                    this.maxLevelSize = Integer.parseInt(args[ind + 1]);
+                } else if ("-attemptsLimit".equals(args[ind])) {
+                        attemptsLimit = Integer.valueOf(args[ind + 1]);
+                } else if ("-unloadingPause".equals(args[ind])) {
+                        unloadingPause = Long.valueOf(args[ind + 1]);
+                } else if ("-pausesLimit".equals(args[ind])) {
+                        pausesLimit = Integer.valueOf(args[ind + 1]);
+                } else if ("-hierarchyType".equals(args[ind])) {
+                    String s = args[ind + 1];
+                    hierarchyType = Type.CLASSES.toString().equals(s) ? Type.CLASSES :
+                            (Type.INTERFACES.toString().equals(s) ? Type.INTERFACES : Type.MIXED);
+                    System.out.println("hierarchyType = " + hierarchyType);
+                } else if (args[ind].startsWith("-") && !args[ind].equals("-stressTime")) {
+                    throw new RuntimeException("Unknown option " + args[ind]);
+                }
+            }
+            performChecksHelper = new PerformChecksHelper(triggerUnloadingHelper, attemptsLimit, unloadingPause, pausesLimit);
+            log.info("treeDepth=" + treeDepth + ", minLevelSize=" + minLevelSize + ", maxLevelSize=" + maxLevelSize + ", hierarchyType=" + hierarchyType +
+                    ", triggerUnloadingHelper.getClass().getName()=" + triggerUnloadingHelper.getClass().getName());
+
+            long startTimeStamp = System.currentTimeMillis();
+            ExecutionController stresser = new Stresser(args);
+            stresser.start(1);
+            TimeoutWatchdog.watch(stresser, this);
+            TreeDescriptor treeDescriptor = GenerateHierarchyHelper.generateHierarchy(treeDepth, minLevelSize, maxLevelSize, hierarchyType);
+            Tree tree = buildTree(treeDescriptor);
+            System.out.println("Generating took " + ((System.currentTimeMillis() - startTimeStamp)/1000) +" sec");
+
+            performChecksHelper.setStresser(stresser);
+
+            runTestLogic(tree, stresser);
+
+            System.out.println("Whole test took " + ((System.currentTimeMillis() - startTimeStamp)/1000/60.0) +" min");
+            log.info("Test PASSED");
+        } catch (GotWrongOOMEException e) {
+            log.info("GotWrongOOMEExc: " + e.getMessage());
+            log.info("Got wrong type of OOME. We are passing test as it breaks test logic. We have dedicated test configurations" +
+            " for each OOME type provoking class unloading, that's why we are not missing test coverage here.");
+        } catch (OutOfMemoryError e) {
+            log.info("Got OOME.");
+        } catch (TimeIsOverException e) {
+            log.info("Time is over. That's okay. Passing test");
+        } catch (Throwable throwable) {
+            //Throw runtime exception. nsk framework will catch it, log and set appropriate exit code
+            log.error("Test failed. Exception catched.");
+            throwable.printStackTrace();
+            throw new RuntimeException(throwable);
+        }
+    }
+
+    @Override
+    public void handleTimeout() {
+        System.out.println("Shutting down vm because of time expired.");
+        System.exit(95);
+    }
+
+    abstract protected void runTestLogic(Tree tree, ExecutionController stresser) throws Throwable;
+
+    private Tree buildTree(TreeDescriptor treeDescriptor) throws MalformedURLException,
+            ClassNotFoundException, InstantiationException,
+            IllegalAccessException {
+        log.info("Create tree");
+        Tree tree = new Tree();
+        for (NodeDescriptor nodeDescriptor : treeDescriptor.nodeDescriptorList) {
+            tree.addNode(nodeDescriptor);
+        }
+
+        log.info("Load classes and instantiate objects");
+        for (Node node : tree.getNodes()) {
+            node.loadClasses();
+            node.instantiateObjects();
+        }
+        return tree;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/StressClassloader.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.classloader;
+
+import java.net.URLClassLoader;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+import metaspace.stressHierarchy.common.generateHierarchy.NodeDescriptor;
+
+/**
+ * This classloader tries to load each class itself before forwarding to parent.
+ * Also it stores loaded classes and class names.
+ *
+ */
+public class StressClassloader extends URLClassLoader {
+
+    private final Set<Class<?>> loadedClasses = new HashSet<Class<?>>();
+
+    private final Set<String> loadedClassesNames = new HashSet<String>();
+
+    private String className;
+
+    private byte[] bytecode;
+
+    public StressClassloader(NodeDescriptor nodeDescriptor,
+            StressClassloader parentClassLoader) {
+      super(new URL[] {}, parentClassLoader);
+      this.className = nodeDescriptor.className;
+      this.bytecode = nodeDescriptor.bytecode;
+    }
+
+    public Set<Class<?>> getLoadedClasses() {
+        return loadedClasses;
+    }
+
+    public Set<String> getLoadedClassNames() {
+        return loadedClassesNames;
+    }
+
+    @Override
+    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        if (loadedClassesNames.contains(name)) {
+            throw new RuntimeException("Classloader " + toString() + " loads class " + name + " second time! ");
+        }
+        Class<?> alreadyLoaded = findLoadedClass(name);
+        if (alreadyLoaded != null) {
+            return alreadyLoaded;
+        }
+        if (className.equals(name)) {
+            Class<?> clazz = defineClass(name, bytecode, 0, bytecode.length);
+            loadedClasses.add(clazz);
+            loadedClassesNames.add(clazz.getName());
+            return clazz;
+        } else {
+            return super.loadClass(name);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "StressClassloader@" + className;
+    }
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/tree/Node.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.classloader.tree;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import metaspace.stressHierarchy.common.classloader.StressClassloader;
+
+/**
+ * Node of tree
+ *
+ */
+public class Node {
+
+    private int level;
+
+    private Set<String> loadedClassesNames;
+
+    private int number;
+
+    private Set<Object> objects = new HashSet<Object>();
+
+    private Node parent = null;
+
+    private StressClassloader classloader;
+
+    public Node(int level, int number) {
+        this.level = level;
+        this.number = number;
+    }
+
+    public void cleanup() {
+        loadedClassesNames = getClassLoader().getLoadedClassNames();
+        objects.clear();
+        getClassLoader().getLoadedClasses().clear();
+        classloader = null;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof Node) {
+            Node other = (Node) obj;
+            return other.getLevel() == level && other.getNumber() == number;
+        } else {
+            return false;
+        }
+    }
+
+    StressClassloader getClassLoader() {     //package access level
+        return classloader;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public Set<Class<?>> getLoadedClasses() {
+        return getClassLoader() == null ? null : getClassLoader().getLoadedClasses();
+    }
+
+    public Set<String> getLoadedClassesNames() {
+        if (loadedClassesNames != null) {
+            return loadedClassesNames;
+        } else if (getClassLoader() != null) {
+            return getClassLoader().getLoadedClassNames();
+        }
+        return null;
+    }
+
+    public int getNumber() {
+        return number;
+    }
+
+    public Node getParent() {
+        return parent;
+    }
+
+    @Override
+    public int hashCode() {
+        return level + number * 999;
+    }
+
+    public void instantiateObjects() throws InstantiationException, IllegalAccessException {
+        for (Class<?> c : getClassLoader().getLoadedClasses()) {
+            if (!c.isInterface()) {
+                objects.add(c.newInstance());
+            }
+        }
+    }
+
+    public boolean isRoot() {
+        return (parent == null);
+    }
+
+    public void setClassLoader(StressClassloader classLoader) {
+        classloader = classLoader;
+    }
+
+    public void setParent(Node parent) {
+        this.parent = parent;
+    }
+
+    @Override
+    public String toString() {
+        return "Node@level=" + level + "_num=" + number;
+    }
+
+    public void loadClasses() throws ClassNotFoundException {
+        String className = "package_level" + getLevel() + "_num" + getNumber() + ".Dummy";
+        getClassLoader().loadClass(className);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/classloader/tree/Tree.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.classloader.tree;
+
+import java.util.*;
+
+import metaspace.stressHierarchy.common.classloader.StressClassloader;
+import metaspace.stressHierarchy.common.generateHierarchy.NodeDescriptor;
+
+
+/**
+ * Tree of hierarchy.
+ *
+ * The tree consists of {@link Nodes}s. Each node contains classloader {@link metaspace.stressHierarchy.common.classloader.StressClassloader} that is
+ * associated with one class (or interface) and can load only it. Edge in this
+ * tree correspond to parent relation between corresponding classloaders.
+ * Each classloader delegates to parent only after failed attempt to load class itself.
+ *
+ */
+public class Tree {
+
+    private final List<Node> allNodes = new LinkedList<Node>(); //order matters
+
+    private int maxLevel;
+
+    private Node root;
+
+    public void cleanupLevel(int level) {
+        for (Node node : getNodesInLevel(level)) {
+            node.cleanup();
+        }
+    }
+
+    public int getMaxLevel() { return maxLevel; }
+
+    public List<Node> getNodes() {
+        return allNodes;
+    }
+
+    public List<Node> getNodesInLevel(int level) {
+        List<Node> result = new LinkedList<Node>();
+        for (Iterator<Node> iter = allNodes.iterator(); iter.hasNext();) {
+            Node current = iter.next();
+            if (current.getLevel() == level) {
+                result.add(current);
+            }
+        }
+        return result;
+    }
+
+    private Node findParent(Node node) {
+        for (Iterator<Node> iter = allNodes.iterator(); iter.hasNext();) {
+            Node current = iter.next();
+            if (current.equals(node)) {
+                return current;
+            }
+        }
+        return null;
+    }
+
+    public void addNode(NodeDescriptor nodeDescriptor) {
+        if (nodeDescriptor.level == 0) {
+            root = new Node(0, 0);
+            root.setClassLoader(new StressClassloader(nodeDescriptor, null));
+            allNodes.add(root);
+            return;
+        }
+        Node newOne = new Node(nodeDescriptor.level, nodeDescriptor.index);
+        Node parent = findParent(new Node(nodeDescriptor.level - 1, nodeDescriptor.parentIndex));
+
+        //add a payload to new node
+        newOne.setClassLoader(new StressClassloader(nodeDescriptor, parent.getClassLoader()));
+
+        newOne.setParent(parent);
+        allNodes.add(newOne);
+        maxLevel = maxLevel < newOne.getLevel() ? newOne.getLevel() : maxLevel;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/ClassNotUnloadedException.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.exceptions;
+
+public class ClassNotUnloadedException extends Exception {
+
+    public ClassNotUnloadedException(String string) {
+        super(string);
+    }
+
+    private static final long serialVersionUID = 1L;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/GotWrongOOMEException.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.exceptions;
+
+/**
+ * Usually this means that we got OOME:heap while trying to gain OOME:metaspace.
+ * We pass test in this case as this breaks test logic. We have dedicated test configurations
+ * for OOME:heap provoking class unloading, that why we are not missing test coverage here.
+ */
+public class GotWrongOOMEException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public GotWrongOOMEException(String string) {
+        super(string);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/exceptions/TimeIsOverException.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.exceptions;
+
+public class TimeIsOverException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/GenerateHierarchyHelper.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.generateHierarchy;
+
+import java.util.*;
+
+import vm.share.InMemoryJavaCompiler;
+
+public class GenerateHierarchyHelper {
+
+        public static enum Type {
+                CLASSES, INTERFACES, MIXED;
+        }
+
+        // Class-container that represents generated source file
+        private static class ClassDescriptor {public String fullName; public CharSequence sourceCode; }
+
+        private static enum Inheritance {
+                CLASS_EXTENDS_CLASS, CLASS_IMPLEMENTS_INTERFACE, INTERFACE_EXTENDS_INTERFACE
+        }
+
+        private static final int EDGE_IN_MIXED_CASE = 30;
+
+        private static Random random = new Random();
+
+        public static TreeDescriptor generateHierarchy(int depth, int minLevelSize, int maxLevelSize, Type type) {
+            TreeDescriptor tree = new TreeDescriptor();
+                Map<String, CharSequence> sourceMap = new HashMap<String, CharSequence>();
+                int numberOfNodesInPrevLevel = 1;
+
+                // generate root
+                String packageName = composePackageName(0, 0);
+                String className = packageName + ".Dummy";
+                switch (type) {
+                case CLASSES:
+                        sourceMap.put(className, "package " + packageName +";\n public class Dummy { " +
+                                        "public int calculate2() {return hashCode();} " +
+                                "public double calculate() {return hashCode() + 0.1;} " +
+                                        "public String composeString() {return \"_root_\";}" +
+                                        "}");
+                        break;
+                default:
+                        sourceMap.put(className, "package " + packageName + ";\n public interface Dummy {}");
+                }
+                tree.addNode(0, 0, 0, className);
+
+                for (int level = 1; level < depth; level++) {
+                        int nodesInLevel = minLevelSize + random.nextInt(maxLevelSize - minLevelSize);
+                        for (int nodeIndex = 0; nodeIndex < nodesInLevel; nodeIndex++) {
+                                int parent = random.nextInt(numberOfNodesInPrevLevel);
+                                Inheritance inheritance = null;
+                                switch (type) {
+                                case CLASSES:
+                                        inheritance = Inheritance.CLASS_EXTENDS_CLASS;
+                                        break;
+                                case INTERFACES:
+                                        inheritance = Inheritance.INTERFACE_EXTENDS_INTERFACE;
+                                        break;
+                                case MIXED:
+                                        inheritance = level < EDGE_IN_MIXED_CASE ? Inheritance.INTERFACE_EXTENDS_INTERFACE
+                                                        : (level == EDGE_IN_MIXED_CASE ? Inheritance.CLASS_IMPLEMENTS_INTERFACE
+                                                                        : Inheritance.CLASS_EXTENDS_CLASS);
+                                        break;
+                                }
+
+                                ClassDescriptor classDescriptor = generateClassCode(level, nodeIndex, parent, inheritance);
+                                sourceMap.put(classDescriptor.fullName, classDescriptor.sourceCode);
+                                tree.addNode(level, nodeIndex, parent, classDescriptor.fullName);
+                        }
+                        numberOfNodesInPrevLevel = nodesInLevel;
+                }
+                Map<String, byte[]> bytecodeMap = InMemoryJavaCompiler.compile(sourceMap);
+                for (NodeDescriptor nodeDescriptor : tree.nodeDescriptorList) {
+                    nodeDescriptor.bytecode = bytecodeMap.get(nodeDescriptor.className);
+                }
+                return tree;
+        }
+
+        private static String composePackageName(int level, int nodeIndex) {
+                return "package_level" + level + "_num" + nodeIndex;
+        }
+
+        private static ClassDescriptor generateClassCode(int level, int nodeIndex, int parent, Inheritance inheritance) {
+                ClassDescriptor result = new ClassDescriptor();
+                String packageName = composePackageName(level, nodeIndex);
+                String parentPackage = composePackageName(level - 1, parent);
+                result.fullName = packageName + ".Dummy";
+                StringBuffer source =  new StringBuffer("package ");
+                source.append(packageName + ";\n\n");
+
+                switch (inheritance) {
+                case INTERFACE_EXTENDS_INTERFACE:
+                        source.append(" public interface Dummy extends " + parentPackage + ".Dummy {}");
+                        break;
+                case CLASS_EXTENDS_CLASS:
+                        source.append(" public class Dummy extends " + parentPackage + ".Dummy { " +
+                    "public int calculate2() {return (super.calculate2() + hashCode() % 1000);} " +
+                    "public double calculate() {return (super.calculate() + hashCode() + 0.1);} " +
+                                        "public String composeString() {return super.composeString() + \"_" + packageName + "_\";}" +
+                                        "}");
+                        break;
+                case CLASS_IMPLEMENTS_INTERFACE:
+                        source.append(" public class Dummy implements " + parentPackage + ".Dummy { " +
+                    "public int calculate2() {return hashCode();} " +
+                    "public double calculate() {return hashCode() + 0.1;} " +
+                                        "public String composeString() {return \"_ancestor_class_\";}" +
+                                        "}");
+                        break;
+                }
+
+                result.sourceCode = source;
+                return result;
+        }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/NodeDescriptor.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.generateHierarchy;
+
+public class NodeDescriptor {
+
+    public String className;
+
+    public byte[] bytecode;
+
+    public int level;
+
+    public int index;
+
+    public int parentIndex;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/generateHierarchy/TreeDescriptor.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2013, 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 metaspace.stressHierarchy.common.generateHierarchy;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class TreeDescriptor {
+
+    public List<NodeDescriptor> nodeDescriptorList = new LinkedList<NodeDescriptor>();
+
+    public void addNode(int level, int index, int parentIndex, String className) {
+        NodeDescriptor node = new NodeDescriptor();
+        node.className = className;
+        node.level = level;
+        node.index = index;
+        node.parentIndex = parentIndex;
+        nodeDescriptorList.add(node);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy001/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy001/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy001.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy1
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType CLASSES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy002/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy002/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy002.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType CLASSES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy003/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy003/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy003.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy1
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType INTERFACES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy004/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy004/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy004.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType INTERFACES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy005/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy005/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy005.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy1
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType MIXED
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy006/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy006/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy006.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType MIXED
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy007/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy007/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy007.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType CLASSES
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy008/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy008/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy008.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType CLASSES
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy009/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy009/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy009.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType INTERFACES
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy010/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy010/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy010.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType INTERFACES
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy011/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy011/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy011.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType MIXED
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy012/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy012/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy012.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @comment generate and compile metaspace.stressHierarchy.common.HumongousClass
+ * @run driver metaspace.stressHierarchy.common.GenClassesBuilder
+ * @run main/othervm
+ *      -XX:MaxMetaspaceSize=450m
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy2
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType MIXED
+ *      -triggerUnloadingByFillingMetaspace
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy013/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy013/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy013.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType CLASSES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy014/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy014/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy014.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType INTERFACES
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy015/TEST.properties	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,1 @@
+exclusiveAccess.dirs=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/stressHierarchy015/TestDescription.java	Tue May 22 13:05:22 2018 -0700
@@ -0,0 +1,47 @@
+/*
+ * 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 metaspace/stressHierarchy/stressHierarchy015.
+ * VM Testbase keywords: [nonconcurrent, javac, no_cds]
+ *
+ * @library /vmTestbase /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm
+ *      -Xss10m
+ *      -Xbootclasspath/a:.
+ *      -XX:+UnlockDiagnosticVMOptions
+ *      -XX:+WhiteBoxAPI
+ *      metaspace.stressHierarchy.common.StressHierarchy3
+ *      -treeDepth 70
+ *      -minLevelSize 10
+ *      -maxLevelSize 100
+ *      -hierarchyType MIXED
+ */
+