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(); } } +