test/gc/class_unloading/TestCMSClassUnloadingEnabledHWM.java

Print this page

        

@@ -24,82 +24,67 @@
 /*
  * @test
  * @key gc
  * @bug 8049831
  * @library /testlibrary /testlibrary/whitebox
- * @build TestCMSClassUnloadingDisabledHWM
+ * @build TestCMSClassUnloadingEnabledHWM AllocateBeyondMetaspaceSize
  * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * @run driver TestCMSClassUnloadingDisabledHWM
+ * @run driver TestCMSClassUnloadingEnabledHWM
  * @summary Test that -XX:-CMSClassUnloadingEnabled will trigger a Full GC when more than MetaspaceSize metadata is allocated.
  */
 
 import com.oracle.java.testlibrary.OutputAnalyzer;
 import com.oracle.java.testlibrary.ProcessTools;
-import sun.hotspot.WhiteBox;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class TestCMSClassUnloadingDisabledHWM {
+public class TestCMSClassUnloadingEnabledHWM {
+  private static long MetaspaceSize = 32 * 1024 * 1024;
+  private static long YoungGenSize  = 32 * 1024 * 1024;
 
-  private static OutputAnalyzer run(long metaspaceSize, long youngGenSize) throws Exception {
+  private static OutputAnalyzer run(boolean enableUnloading) throws Exception {
       ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
         "-Xbootclasspath/a:.",
         "-XX:+WhiteBoxAPI",
-        "-XX:MetaspaceSize=" + metaspaceSize,
-        "-Xmn" + youngGenSize,
+      "-XX:MetaspaceSize=" + MetaspaceSize,
+      "-Xmn" + YoungGenSize,
         "-XX:+UseConcMarkSweepGC",
-        "-XX:-CMSClassUnloadingEnabled",
+      "-XX:" + (enableUnloading ? "+" : "-") + "CMSClassUnloadingEnabled",
         "-XX:+PrintHeapAtGC",
         "-XX:+PrintGCDetails",
         "AllocateBeyondMetaspaceSize",
-        "" + metaspaceSize,
-        "" + youngGenSize);
+      "" + MetaspaceSize,
+      "" + YoungGenSize);
     return new OutputAnalyzer(pb.start());
   }
 
-  public static void main(String args[]) throws Exception {
-    long metaspaceSize = 32 * 1024 * 1024;
-    long youngGenSize = 32 * 1024 * 1024;
-
-    OutputAnalyzer out = run(metaspaceSize, youngGenSize);
-
-    // -XX:-CMSClassUnloadingEnabled is used, so we expect a full GC instead of a concurrent cycle.
-    out.shouldMatch(".*Full GC.*");
-    out.shouldNotMatch(".*CMS Initial Mark.*");
+  public static OutputAnalyzer runWithCMSClassUnloading() throws Exception {
+    return run(true);
   }
-}
 
-class AllocateBeyondMetaspaceSize {
-  public static Object dummy;
-
-  public static void main(String [] args) {
-    if (args.length != 2) {
-      throw new IllegalArgumentException("Usage: <MetaspaceSize> <YoungGenSize>");
+  public static OutputAnalyzer runWithoutCMSClassUnloading() throws Exception {
+    return run(false);
     }
 
-    long metaspaceSize = Long.parseLong(args[0]);
-    long youngGenSize = Long.parseLong(args[1]);
+  public static void testWithoutCMSClassUnloading() throws Exception {
+    // -XX:-CMSClassUnloadingEnabled is used, so we expect a full GC instead of a concurrent cycle.
+    OutputAnalyzer out = runWithoutCMSClassUnloading();
 
-    run(metaspaceSize, youngGenSize);
+    out.shouldMatch(".*Full GC.*");
+    out.shouldNotMatch(".*CMS Initial Mark.*");
   }
 
-  private static void run(long metaspaceSize, long youngGenSize) {
-    WhiteBox wb = WhiteBox.getWhiteBox();
-
-    long allocationBeyondMetaspaceSize  = metaspaceSize * 2;
-    long metaspace = wb.allocateMetaspace(null, allocationBeyondMetaspaceSize);
-
-    triggerYoungGC(youngGenSize);
+  public static void testWithCMSClassUnloading() throws Exception {
+    // -XX:+CMSClassUnloadingEnabled is used, so we expect a concurrent cycle instead of a full GC.
+    OutputAnalyzer out = runWithCMSClassUnloading();
 
-    wb.freeMetaspace(null, metaspace, metaspace);
+    out.shouldMatch(".*CMS Initial Mark.*");
+    out.shouldNotMatch(".*Full GC.*");
   }
 
-  private static void triggerYoungGC(long youngGenSize) {
-    long approxAllocSize = 32 * 1024;
-    long numAllocations  = 2 * youngGenSize / approxAllocSize;
-
-    for (long i = 0; i < numAllocations; i++) {
-      dummy = new byte[(int)approxAllocSize];
-    }
+  public static void main(String args[]) throws Exception {
+    testWithCMSClassUnloading();
+    testWithoutCMSClassUnloading();
   }
 }
+