8037510: CMM Testing: Check Min/MaxHeapFreeRatio flags allows to shrink the heap when using ParallelGC
Summary: Added tests for Min/MaxHeapFreeRatio flags
Reviewed-by: jwilhelm, tschatzl
Contributed-by: andrey.x.zakharov@oracle.com
--- a/hotspot/test/TEST.groups Mon Mar 17 20:59:19 2014 +0100
+++ b/hotspot/test/TEST.groups Mon Mar 17 16:29:13 2014 +0100
@@ -129,6 +129,8 @@
gc/g1/TestHumongousAllocInitialMark.java \
gc/arguments/TestG1HeapRegionSize.java \
gc/metaspace/TestMetaspaceMemoryPool.java \
+ gc/arguments/TestDynMinHeapFreeRatio.java \
+ gc/arguments/TestDynMaxHeapFreeRatio.java \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
serviceability/threads/TestFalseDeadLock.java \
compiler/tiered/NonTieredLevelsTest.java \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestDynMaxHeapFreeRatio.java Mon Mar 17 16:29:13 2014 +0100
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test TestDynMaxHeapFreeRatio
+ * @bug 8028391
+ * @summary Verify that MaxHeapFreeRatio flag is manageable
+ * @library /testlibrary
+ * @run main TestDynMaxHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 TestDynMaxHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 -XX:-UseAdaptiveSizePolicy TestDynMaxHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 TestDynMaxHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=51 -XX:MaxHeapFreeRatio=52 TestDynMaxHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=75 -XX:MaxHeapFreeRatio=100 TestDynMaxHeapFreeRatio
+ */
+import com.oracle.java.testlibrary.TestDynamicVMOption;
+import com.oracle.java.testlibrary.DynamicVMOptionChecker;
+
+public class TestDynMaxHeapFreeRatio extends TestDynamicVMOption {
+
+ public static final String MinFreeRatioFlagName = "MinHeapFreeRatio";
+ public static final String MaxFreeRatioFlagName = "MaxHeapFreeRatio";
+
+ public TestDynMaxHeapFreeRatio() {
+ super(MaxFreeRatioFlagName);
+ }
+
+ public void test() {
+
+ int minHeapFreeValue = DynamicVMOptionChecker.getIntValue(MinFreeRatioFlagName);
+ System.out.println(MinFreeRatioFlagName + " = " + minHeapFreeValue);
+
+ testPercentageValues();
+
+ checkInvalidValue(Integer.toString(minHeapFreeValue - 1));
+ checkValidValue(Integer.toString(minHeapFreeValue));
+ checkValidValue("100");
+ }
+
+ public static void main(String args[]) throws Exception {
+ new TestDynMaxHeapFreeRatio().test();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestDynMinHeapFreeRatio.java Mon Mar 17 16:29:13 2014 +0100
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test TestDynMinHeapFreeRatio
+ * @bug 8028391
+ * @summary Verify that MinHeapFreeRatio flag is manageable
+ * @library /testlibrary
+ * @run main TestDynMinHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 TestDynMinHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 -XX:-UseAdaptiveSizePolicy TestDynMinHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 TestDynMinHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=51 -XX:MaxHeapFreeRatio=52 TestDynMinHeapFreeRatio
+ * @run main/othervm -XX:MinHeapFreeRatio=75 -XX:MaxHeapFreeRatio=100 TestDynMinHeapFreeRatio
+ */
+import com.oracle.java.testlibrary.TestDynamicVMOption;
+import com.oracle.java.testlibrary.DynamicVMOptionChecker;
+
+public class TestDynMinHeapFreeRatio extends TestDynamicVMOption {
+
+ public static final String MinFreeRatioFlagName = "MinHeapFreeRatio";
+ public static final String MaxFreeRatioFlagName = "MaxHeapFreeRatio";
+
+ public TestDynMinHeapFreeRatio() {
+ super(MinFreeRatioFlagName);
+ }
+
+ public void test() {
+ int maxHeapFreeValue = DynamicVMOptionChecker.getIntValue(MaxFreeRatioFlagName);
+ System.out.println(MaxFreeRatioFlagName + " = " + maxHeapFreeValue);
+
+ testPercentageValues();
+
+ checkInvalidValue(Integer.toString(maxHeapFreeValue + 1));
+ checkValidValue(Integer.toString(maxHeapFreeValue));
+ checkValidValue("0");
+ }
+
+ public static void main(String args[]) throws Exception {
+ new TestDynMinHeapFreeRatio().test();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/DynamicVMOptionChecker.java Mon Mar 17 16:29:13 2014 +0100
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.java.testlibrary;
+
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+import java.lang.management.ManagementFactory;
+
+/**
+ * Simple class to check writeability, invalid and valid values for VMOption
+ */
+public class DynamicVMOptionChecker {
+
+ /**
+ * Reads VM option from PlatformMXBean and parse it to integer value
+ *
+ * @param name of option
+ * @return parsed value
+ */
+ public static int getIntValue(String name) {
+
+ VMOption option = ManagementFactory.
+ getPlatformMXBean(HotSpotDiagnosticMXBean.class).
+ getVMOption(name);
+
+ return Integer.parseInt(option.getValue());
+ }
+
+ /**
+ * Sets VM option value
+ *
+ * @param name of option
+ * @param value to set
+ */
+ public static void setIntValue(String name, int value) {
+ ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class).setVMOption(name, Integer.toString(value));
+ }
+
+ /**
+ * Checks that VM option is dynamically writable
+ *
+ * @param name
+ * @throws RuntimeException if option if not writable
+ * @return always true
+ */
+ public static boolean checkIsWritable(String name) {
+ VMOption option = ManagementFactory.
+ getPlatformMXBean(HotSpotDiagnosticMXBean.class).
+ getVMOption(name);
+
+ if (!option.isWriteable()) {
+ throw new RuntimeException(name + " is not writable");
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks that value cannot be set
+ *
+ * @param name of flag
+ * @param value string representation of value to set
+ * @throws RuntimeException on error - when expected exception hasn't been thrown
+ */
+ public static void checkInvalidValue(String name, String value) {
+ // should throw
+ try {
+ ManagementFactory.
+ getPlatformMXBean(HotSpotDiagnosticMXBean.class).
+ setVMOption(name, value);
+
+ } catch (IllegalArgumentException e) {
+ return;
+ }
+
+ throw new RuntimeException("Expected IllegalArgumentException was not thrown, " + name + "= " + value);
+ }
+
+ /**
+ * Checks that value can be set
+ *
+ * @param name of flag to set
+ * @param value string representation of value to set
+ * @throws RuntimeException on error - when value in VM is not equal to origin
+ */
+ public static void checkValidValue(String name, String value) {
+ ManagementFactory.
+ getPlatformMXBean(HotSpotDiagnosticMXBean.class).
+ setVMOption(name, value);
+
+ VMOption option = ManagementFactory.
+ getPlatformMXBean(HotSpotDiagnosticMXBean.class).
+ getVMOption(name);
+
+ if (!option.getValue().equals(value)) {
+ throw new RuntimeException("Actual value of " + name + " \"" + option.getValue()
+ + "\" not equal origin \"" + value + "\"");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/TestDynamicVMOption.java Mon Mar 17 16:29:13 2014 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.java.testlibrary;
+
+/**
+ * Simple class to check writeability, invalid and valid values for concrete VMOption
+ */
+public class TestDynamicVMOption {
+
+ private final String name;
+ private final int value;
+
+ /**
+ * Constructor
+ *
+ * @param name of VM option to test
+ */
+ public TestDynamicVMOption(String name) {
+ this.name = name;
+ this.value = DynamicVMOptionChecker.getIntValue(name);
+ System.out.println(this.name + " = " + this.value);
+ }
+
+ /**
+ * Checks that this value can accept valid percentage values and cannot accept invalid percentage values
+ *
+ * @throws RuntimeException
+ */
+ public void testPercentageValues() {
+ checkInvalidValue(Integer.toString(Integer.MIN_VALUE));
+ checkInvalidValue(Integer.toString(Integer.MAX_VALUE));
+ checkInvalidValue("-10");
+ checkInvalidValue("190");
+ }
+
+ /**
+ * Reads VM option from PlatformMXBean and parse it to integer value
+ *
+ * @return value
+ */
+ public int getIntValue() {
+ return DynamicVMOptionChecker.getIntValue(this.name);
+ }
+
+ /**
+ * Sets VM option value
+ *
+ * @param value to set
+ */
+ public void setIntValue(int value) {
+ DynamicVMOptionChecker.setIntValue(this.name, value);
+ }
+
+ /**
+ * Checks that this VM option is dynamically writable
+ *
+ * @throws RuntimeException if option if not writable
+ * @return true
+ */
+ public boolean checkIsWritable() throws RuntimeException {
+ return DynamicVMOptionChecker.checkIsWritable(this.name);
+ }
+
+ /**
+ * Checks that value for this VM option cannot be set
+ *
+ * @param value to check
+ * @throws RuntimeException on error - when expected exception hasn't been thrown
+ */
+ public void checkInvalidValue(String value) {
+ DynamicVMOptionChecker.checkInvalidValue(this.name, value);
+ }
+
+ /**
+ * Checks that value for this VM option can be set
+ *
+ * @param value to check
+ * @throws RuntimeException on error - when value in VM is not equal to origin
+ */
+ public void checkValidValue(String value) {
+ DynamicVMOptionChecker.checkValidValue(this.name, value);
+ }
+
+}