< 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 >