< prev index next >

test/hotspot/jtreg/gc/g1/TestVerifyGCType.java

Print this page
rev 48019 : 8191821: Finer granularity for GC verification
Reviewed-by:
rev 48020 : [mq]: 8191821-rev-sang-poonam
rev 48021 : [mq]: 8191821-rev-tsch

@@ -25,20 +25,23 @@
  * @test TestVerifyGCType
  * @summary Test the VerifyGCType flag to ensure basic functionality.
  * @key gc
  * @requires vm.gc.G1
  * @library /test/lib
+ * @build sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
  * @run driver TestVerifyGCType
  */
 
 import java.util.ArrayList;
 import java.util.Collections;
 
 import jdk.test.lib.Asserts;
 import jdk.test.lib.Utils;
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.process.ProcessTools;
+import sun.hotspot.WhiteBox;
 
 public class TestVerifyGCType {
     public static final String VERIFY_TAG    = "[gc,verify]";
     public static final String VERIFY_BEFORE = "Verifying Before GC";
     public static final String VERIFY_DURING = "Verifying During GC";

@@ -46,32 +49,38 @@
 
     public static void main(String args[]) throws Exception {
         testAllVerificationEnabled();
         testAllExplicitlyEnabled();
         testFullAndRemark();
+        testConcurrentMark();
         testBadVerificationType();
         testUnsupportedCollector();
     }
 
     private static void testAllVerificationEnabled() throws Exception {
         // Test with all verification enabled
         OutputAnalyzer output = testWithVerificationType(new String[0]);
         output.shouldHaveExitValue(0);
 
         verifyCollection("Pause Young", true, false, true, output.getStdout());
+        verifyCollection("Pause Initial Mark", true, false, true, output.getStdout());
+        verifyCollection("Pause Mixed", true, false, true, output.getStdout());
         verifyCollection("Pause Remark", false, true, false, output.getStdout());
         verifyCollection("Pause Cleanup", false, true, false, output.getStdout());
         verifyCollection("Pause Full", true, true, true, output.getStdout());
     }
 
     private static void testAllExplicitlyEnabled() throws Exception {
         OutputAnalyzer output;
         // Test with all explicitly enabled
-        output = testWithVerificationType(new String[] {"young", "remark", "cleanup", "full"});
+        output = testWithVerificationType(new String[] {
+                "young-only", "initial-mark", "mixed", "remark", "cleanup", "full"});
         output.shouldHaveExitValue(0);
 
         verifyCollection("Pause Young", true, false, true, output.getStdout());
+        verifyCollection("Pause Initial Mark", true, false, true, output.getStdout());
+        verifyCollection("Pause Mixed", true, false, true, output.getStdout());
         verifyCollection("Pause Remark", false, true, false, output.getStdout());
         verifyCollection("Pause Cleanup", false, true, false, output.getStdout());
         verifyCollection("Pause Full", true, true, true, output.getStdout());
     }
 

@@ -80,23 +89,41 @@
         // Test with full and remark
         output = testWithVerificationType(new String[] {"remark", "full"});
         output.shouldHaveExitValue(0);
 
         verifyCollection("Pause Young", false, false, false, output.getStdout());
+        verifyCollection("Pause Initial Mark", false, false, false, output.getStdout());
+        verifyCollection("Pause Mixed", false, false, false, output.getStdout());
         verifyCollection("Pause Remark", false, true, false, output.getStdout());
         verifyCollection("Pause Cleanup", false, false, false, output.getStdout());
         verifyCollection("Pause Full", true, true, true, output.getStdout());
     }
 
+    private static void testConcurrentMark() throws Exception {
+        OutputAnalyzer output;
+        // Test with full and remark
+        output = testWithVerificationType(new String[] {"initial-mark", "cleanup", "remark"});
+        output.shouldHaveExitValue(0);
+
+        verifyCollection("Pause Young", false, false, false, output.getStdout());
+        verifyCollection("Pause Initial Mark", true, false, true, output.getStdout());
+        verifyCollection("Pause Mixed", false, false, false, output.getStdout());
+        verifyCollection("Pause Remark", false, true, false, output.getStdout());
+        verifyCollection("Pause Cleanup", false, true, false, output.getStdout());
+        verifyCollection("Pause Full", false, false, false, output.getStdout());
+    }
+
     private static void testBadVerificationType() throws Exception {
         OutputAnalyzer output;
         // Test bad type
         output = testWithVerificationType(new String[] {"old"});
         output.shouldHaveExitValue(0);
 
-        output.shouldMatch("VerifyGCType: '.*' is unknown. Available types are: young, mixed, remark, cleanup and full");
+        output.shouldMatch("VerifyGCType: '.*' is unknown. Available types are: young-only, initial-mark, mixed, remark, cleanup and full");
         verifyCollection("Pause Young", true, false, true, output.getStdout());
+        verifyCollection("Pause Initial Mark", true, false, true, output.getStdout());
+        verifyCollection("Pause Mixed", true, false, true, output.getStdout());
         verifyCollection("Pause Remark", false, true, false, output.getStdout());
         verifyCollection("Pause Cleanup", false, true, false, output.getStdout());
         verifyCollection("Pause Full", true, true, true, output.getStdout());
     }
 

@@ -109,26 +136,25 @@
     }
 
     private static OutputAnalyzer testWithVerificationType(String[] types) throws Exception {
         ArrayList<String> basicOpts = new ArrayList<>();
         Collections.addAll(basicOpts, new String[] {
+                                       "-Xbootclasspath/a:.",
                                        "-XX:+UseG1GC",
-                                       "-XX:InitiatingHeapOccupancyPercent=1",
+                                       "-XX:+WhiteBoxAPI",
+                                       "-XX:+ExplicitGCInvokesConcurrent",
                                        "-Xlog:gc,gc+start,gc+verify=info",
-                                       "-Xmx10m",
-                                       "-Xms10m",
-                                       "-Xmn2m",
                                        "-XX:+UnlockDiagnosticVMOptions",
                                        "-XX:+VerifyBeforeGC",
                                        "-XX:+VerifyAfterGC",
                                        "-XX:+VerifyDuringGC"});
 
         for(String verifyType : types) {
             basicOpts.add("-XX:VerifyGCType="+verifyType);
         }
 
-        basicOpts.add(GarbageProducer.class.getName());
+        basicOpts.add(TriggerGCs.class.getName());
 
         ProcessBuilder procBuilder =  ProcessTools.createJavaProcessBuilder(basicOpts.toArray(
                                                                             new String[basicOpts.size()]));
         OutputAnalyzer analyzer = new OutputAnalyzer(procBuilder.start());
         return analyzer;

@@ -212,20 +238,19 @@
             }
             return result;
         }
     }
 
-    public static class GarbageProducer {
-        static Object[] garbage = new Object[100];
-
+    public static class TriggerGCs {
         public static void main(String args[]) throws Exception {
-            // Ensure at least one full GC
-            System.gc();
-            // Alloc 10M, but only keep 1M alive.
-            for(int i = 0; i<1000; i++) {
-                garbage[i%garbage.length] = new byte[10240];
-            }
+            WhiteBox wb = WhiteBox.getWhiteBox();
+            // Trigger the differnt GCs using the WhiteBox API and System.gc()
+            // to start a concurrent cycle with -XX:+ExplicitGCInvokesConcurrent.
+            wb.fullGC();  // full
+            System.gc();  // initial-mark, remark and cleanup
             // Sleep to make sure concurrent cycle is done
             Thread.sleep(1000);
+            wb.youngGC(); // young-only
+            wb.youngGC(); // mixed
         }
     }
 }
< prev index next >