--- old/test/hotspot/jtreg/gc/g1/TestVerifyGCType.java 2017-11-29 16:41:21.836916460 +0100 +++ new/test/hotspot/jtreg/gc/g1/TestVerifyGCType.java 2017-11-29 16:41:21.592906815 +0100 @@ -27,6 +27,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox * @run driver TestVerifyGCType */ @@ -37,6 +39,7 @@ 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]"; @@ -48,6 +51,7 @@ testAllVerificationEnabled(); testAllExplicitlyEnabled(); testFullAndRemark(); + testConcurrentMark(); testBadVerificationType(); testUnsupportedCollector(); } @@ -58,6 +62,8 @@ 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()); @@ -66,10 +72,13 @@ 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()); @@ -82,19 +91,37 @@ 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()); @@ -111,12 +138,11 @@ private static OutputAnalyzer testWithVerificationType(String[] types) throws Exception { ArrayList 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", @@ -126,7 +152,7 @@ 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()])); @@ -214,18 +240,17 @@ } } - 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 } } }