8047976: Ergonomics for GC thread counts should update the flags
Summary: Ergonomics updates flags for number of GC threads
Reviewed-by: tschatzl, jwilhelm
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Fri Sep 26 01:40:31 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Sat Sep 27 15:11:41 2014 +0200
@@ -128,9 +128,7 @@
}
uint ConcurrentG1Refine::thread_num() {
- uint n_threads = (G1ConcRefinementThreads > 0) ? G1ConcRefinementThreads
- : ParallelGCThreads;
- return MAX2<uint>(n_threads, 1);
+ return G1ConcRefinementThreads;
}
void ConcurrentG1Refine::print_worker_threads_on(outputStream* st) const {
--- a/hotspot/src/share/vm/runtime/arguments.cpp Fri Sep 26 01:40:31 2014 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Sat Sep 27 15:11:41 2014 +0200
@@ -1697,6 +1697,12 @@
Abstract_VM_Version::parallel_worker_threads());
}
+#if INCLUDE_ALL_GCS
+ if (G1ConcRefinementThreads == 0) {
+ FLAG_SET_DEFAULT(G1ConcRefinementThreads, ParallelGCThreads);
+ }
+#endif
+
// MarkStackSize will be set (if it hasn't been set by the user)
// when concurrent marking is initialized.
// Its value will be based upon the number of parallel marking threads.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestG1ConcRefinementThreads.java Sat Sep 27 15:11:41 2014 +0200
@@ -0,0 +1,97 @@
+/*
+* 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 TestG1ConcRefinementThreads
+ * @key gc
+ * @bug 8047976
+ * @summary Tests argument processing for G1ConcRefinementThreads
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+import java.util.*;
+import java.util.regex.*;
+
+public class TestG1ConcRefinementThreads {
+
+ static final int AUTO_SELECT_THREADS_COUNT = 0;
+ static final int PASSED_THREADS_COUNT = 11;
+
+ public static void main(String args[]) throws Exception {
+ // default case
+ runG1ConcRefinementThreadsTest(
+ new String[]{}, // automatically selected
+ AUTO_SELECT_THREADS_COUNT /* use default setting */);
+
+ // zero setting case
+ runG1ConcRefinementThreadsTest(
+ new String[]{"-XX:G1ConcRefinementThreads=0"}, // automatically selected
+ AUTO_SELECT_THREADS_COUNT /* set to zero */);
+
+ // non-zero sestting case
+ runG1ConcRefinementThreadsTest(
+ new String[]{"-XX:G1ConcRefinementThreads="+Integer.toString(PASSED_THREADS_COUNT)},
+ PASSED_THREADS_COUNT);
+ }
+
+ private static void runG1ConcRefinementThreadsTest(String[] passedOpts,
+ int expectedValue) throws Exception {
+ List<String> vmOpts = new ArrayList<>();
+ if (passedOpts.length > 0) {
+ Collections.addAll(vmOpts, passedOpts);
+ }
+ Collections.addAll(vmOpts, "-XX:+UseG1GC", "-XX:+PrintFlagsFinal", "-version");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(vmOpts.toArray(new String[vmOpts.size()]));
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ output.shouldHaveExitValue(0);
+ String stdout = output.getStdout();
+ checkG1ConcRefinementThreadsConsistency(stdout, expectedValue);
+ }
+
+ private static void checkG1ConcRefinementThreadsConsistency(String output, int expectedValue) {
+ int actualValue = getIntValue("G1ConcRefinementThreads", output);
+
+ if (expectedValue == 0) {
+ // If expectedValue is automatically selected, set it same as ParallelGCThreads.
+ expectedValue = getIntValue("ParallelGCThreads", output);
+ }
+
+ if (expectedValue != actualValue) {
+ throw new RuntimeException(
+ "Actual G1ConcRefinementThreads(" + Integer.toString(actualValue)
+ + ") is not equal to expected value(" + Integer.toString(expectedValue) + ")");
+ }
+ }
+
+ public static int getIntValue(String flag, String where) {
+ Matcher m = Pattern.compile(flag + "\\s+:?=\\s+\\d+").matcher(where);
+ if (!m.find()) {
+ throw new RuntimeException("Could not find value for flag " + flag + " in output string");
+ }
+ String match = m.group();
+ return Integer.parseInt(match.substring(match.lastIndexOf(" ") + 1, match.length()));
+ }
+}