test/gc/class_unloading/TestCMSClassUnloadingEnabledHWM.java
Print this page
*** 24,105 ****
/*
* @test
* @key gc
* @bug 8049831
* @library /testlibrary /testlibrary/whitebox
! * @build TestCMSClassUnloadingDisabledHWM
* @run main ClassFileInstaller sun.hotspot.WhiteBox
! * @run driver TestCMSClassUnloadingDisabledHWM
* @summary Test that -XX:-CMSClassUnloadingEnabled will trigger a Full GC when more than MetaspaceSize metadata is allocated.
*/
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.ProcessTools;
- import sun.hotspot.WhiteBox;
import java.util.ArrayList;
import java.util.Arrays;
! public class TestCMSClassUnloadingDisabledHWM {
! private static OutputAnalyzer run(long metaspaceSize, long youngGenSize) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-XX:+WhiteBoxAPI",
! "-XX:MetaspaceSize=" + metaspaceSize,
! "-Xmn" + youngGenSize,
"-XX:+UseConcMarkSweepGC",
! "-XX:-CMSClassUnloadingEnabled",
"-XX:+PrintHeapAtGC",
"-XX:+PrintGCDetails",
"AllocateBeyondMetaspaceSize",
! "" + metaspaceSize,
! "" + youngGenSize);
return new OutputAnalyzer(pb.start());
}
! public static void main(String args[]) throws Exception {
! long metaspaceSize = 32 * 1024 * 1024;
! long youngGenSize = 32 * 1024 * 1024;
!
! OutputAnalyzer out = run(metaspaceSize, youngGenSize);
!
! // -XX:-CMSClassUnloadingEnabled is used, so we expect a full GC instead of a concurrent cycle.
! out.shouldMatch(".*Full GC.*");
! out.shouldNotMatch(".*CMS Initial Mark.*");
}
- }
! class AllocateBeyondMetaspaceSize {
! public static Object dummy;
!
! public static void main(String [] args) {
! if (args.length != 2) {
! throw new IllegalArgumentException("Usage: <MetaspaceSize> <YoungGenSize>");
}
! long metaspaceSize = Long.parseLong(args[0]);
! long youngGenSize = Long.parseLong(args[1]);
! run(metaspaceSize, youngGenSize);
}
! private static void run(long metaspaceSize, long youngGenSize) {
! WhiteBox wb = WhiteBox.getWhiteBox();
!
! long allocationBeyondMetaspaceSize = metaspaceSize * 2;
! long metaspace = wb.allocateMetaspace(null, allocationBeyondMetaspaceSize);
!
! triggerYoungGC(youngGenSize);
! wb.freeMetaspace(null, metaspace, metaspace);
}
! private static void triggerYoungGC(long youngGenSize) {
! long approxAllocSize = 32 * 1024;
! long numAllocations = 2 * youngGenSize / approxAllocSize;
!
! for (long i = 0; i < numAllocations; i++) {
! dummy = new byte[(int)approxAllocSize];
! }
}
}
--- 24,90 ----
/*
* @test
* @key gc
* @bug 8049831
* @library /testlibrary /testlibrary/whitebox
! * @build TestCMSClassUnloadingEnabledHWM AllocateBeyondMetaspaceSize
* @run main ClassFileInstaller sun.hotspot.WhiteBox
! * @run driver TestCMSClassUnloadingEnabledHWM
* @summary Test that -XX:-CMSClassUnloadingEnabled will trigger a Full GC when more than MetaspaceSize metadata is allocated.
*/
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.ProcessTools;
import java.util.ArrayList;
import java.util.Arrays;
! public class TestCMSClassUnloadingEnabledHWM {
! private static long MetaspaceSize = 32 * 1024 * 1024;
! private static long YoungGenSize = 32 * 1024 * 1024;
! private static OutputAnalyzer run(boolean enableUnloading) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-XX:+WhiteBoxAPI",
! "-XX:MetaspaceSize=" + MetaspaceSize,
! "-Xmn" + YoungGenSize,
"-XX:+UseConcMarkSweepGC",
! "-XX:" + (enableUnloading ? "+" : "-") + "CMSClassUnloadingEnabled",
"-XX:+PrintHeapAtGC",
"-XX:+PrintGCDetails",
"AllocateBeyondMetaspaceSize",
! "" + MetaspaceSize,
! "" + YoungGenSize);
return new OutputAnalyzer(pb.start());
}
! public static OutputAnalyzer runWithCMSClassUnloading() throws Exception {
! return run(true);
}
! public static OutputAnalyzer runWithoutCMSClassUnloading() throws Exception {
! return run(false);
}
! public static void testWithoutCMSClassUnloading() throws Exception {
! // -XX:-CMSClassUnloadingEnabled is used, so we expect a full GC instead of a concurrent cycle.
! OutputAnalyzer out = runWithoutCMSClassUnloading();
! out.shouldMatch(".*Full GC.*");
! out.shouldNotMatch(".*CMS Initial Mark.*");
}
! public static void testWithCMSClassUnloading() throws Exception {
! // -XX:+CMSClassUnloadingEnabled is used, so we expect a concurrent cycle instead of a full GC.
! OutputAnalyzer out = runWithCMSClassUnloading();
! out.shouldMatch(".*CMS Initial Mark.*");
! out.shouldNotMatch(".*Full GC.*");
}
! public static void main(String args[]) throws Exception {
! testWithCMSClassUnloading();
! testWithoutCMSClassUnloading();
}
}
+