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