test/gc/class_unloading/TestCMSClassUnloadingEnabledHWM.java
Print this page
rev 7004 : imported patch fix
*** 24,64 ****
/*
* @test
* @key gc
* @bug 8049831
* @library /testlibrary /testlibrary/whitebox
! * @build TestCMSClassUnloadingEnabledHWM AllocateBeyondMetaspaceSize
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @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:+UnlockDiagnosticVMOptions",
"-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);
--- 24,69 ----
/*
* @test
* @key gc
* @bug 8049831
* @library /testlibrary /testlibrary/whitebox
! * @build TestCMSClassUnloadingEnabledHWM
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @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.lang.management.GarbageCollectorMXBean;
! import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Arrays;
+ import sun.hotspot.WhiteBox;
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:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
+ "-Xmx128m",
+ "-XX:CMSMaxAbortablePrecleanTime=1",
+ "-XX:CMSWaitDuration=50",
"-XX:MetaspaceSize=" + MetaspaceSize,
"-Xmn" + YoungGenSize,
"-XX:+UseConcMarkSweepGC",
"-XX:" + (enableUnloading ? "+" : "-") + "CMSClassUnloadingEnabled",
"-XX:+PrintHeapAtGC",
"-XX:+PrintGCDetails",
! "-XX:+PrintGCTimeStamps",
! "TestCMSClassUnloadingEnabledHWM$AllocateBeyondMetaspaceSize",
! "" + MetaspaceSize);
return new OutputAnalyzer(pb.start());
}
public static OutputAnalyzer runWithCMSClassUnloading() throws Exception {
return run(true);
*** 86,92 ****
--- 91,129 ----
public static void main(String args[]) throws Exception {
testWithCMSClassUnloading();
testWithoutCMSClassUnloading();
}
+
+ public static class AllocateBeyondMetaspaceSize {
+ public static void main(String [] args) throws Exception {
+ if (args.length != 1) {
+ throw new IllegalArgumentException("Usage: <MetaspaceSize>");
+ }
+
+ WhiteBox wb = WhiteBox.getWhiteBox();
+
+ // Allocate past the MetaspaceSize limit.
+ long metaspaceSize = Long.parseLong(args[0]);
+ long allocationBeyondMetaspaceSize = metaspaceSize * 2;
+ long metaspace = wb.allocateMetaspace(null, allocationBeyondMetaspaceSize);
+
+ // Wait for at least one GC to occur. The caller will parse the log files produced.
+ GarbageCollectorMXBean cmsGCBean = getCMSGCBean();
+ while (cmsGCBean.getCollectionCount() == 0) {
+ Thread.sleep(100);
+ }
+
+ wb.freeMetaspace(null, metaspace, metaspace);
+ }
+
+ private static GarbageCollectorMXBean getCMSGCBean() {
+ for (GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans()) {
+ if (gcBean.getObjectName().toString().equals("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep")) {
+ return gcBean;
+ }
+ }
+ return null;
+ }
+ }
}