< 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,44 **** --- 25,47 ---- * @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,77 **** public static void main(String args[]) throws Exception { testAllVerificationEnabled(); testAllExplicitlyEnabled(); testFullAndRemark(); 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 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.shouldHaveExitValue(0); verifyCollection("Pause Young", 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()); } --- 49,86 ---- 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-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,102 **** // Test with full and remark output = testWithVerificationType(new String[] {"remark", "full"}); output.shouldHaveExitValue(0); verifyCollection("Pause Young", 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 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"); verifyCollection("Pause Young", 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()); } --- 89,129 ---- // 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-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,134 **** } private static OutputAnalyzer testWithVerificationType(String[] types) throws Exception { ArrayList<String> basicOpts = new ArrayList<>(); Collections.addAll(basicOpts, new String[] { "-XX:+UseG1GC", ! "-XX:InitiatingHeapOccupancyPercent=1", "-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()); ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(basicOpts.toArray( new String[basicOpts.size()])); OutputAnalyzer analyzer = new OutputAnalyzer(procBuilder.start()); return analyzer; --- 136,160 ---- } private static OutputAnalyzer testWithVerificationType(String[] types) throws Exception { ArrayList<String> basicOpts = new ArrayList<>(); Collections.addAll(basicOpts, new String[] { + "-Xbootclasspath/a:.", "-XX:+UseG1GC", ! "-XX:+WhiteBoxAPI", ! "-XX:+ExplicitGCInvokesConcurrent", "-Xlog:gc,gc+start,gc+verify=info", "-XX:+UnlockDiagnosticVMOptions", "-XX:+VerifyBeforeGC", "-XX:+VerifyAfterGC", "-XX:+VerifyDuringGC"}); for(String verifyType : types) { basicOpts.add("-XX:VerifyGCType="+verifyType); } ! basicOpts.add(TriggerGCs.class.getName()); ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(basicOpts.toArray( new String[basicOpts.size()])); OutputAnalyzer analyzer = new OutputAnalyzer(procBuilder.start()); return analyzer;
*** 212,231 **** } return result; } } ! public static class GarbageProducer { ! static Object[] garbage = new Object[100]; ! 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]; ! } // Sleep to make sure concurrent cycle is done Thread.sleep(1000); } } } --- 238,256 ---- } return result; } } ! public static class TriggerGCs { public static void main(String args[]) throws Exception { ! 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 >