# HG changeset patch # User mlarsson # Date 1412167816 -7200 # Wed Oct 01 14:50:16 2014 +0200 # Node ID 422884ee8ba7cd712975d9cc47f5d22b3e9c62cb # Parent 6534c979ef0f37988f49cced407e09bcb7394fd9 [mq]: 8059527 diff --git a/src/share/vm/runtime/arguments.cpp b/src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp +++ b/src/share/vm/runtime/arguments.cpp @@ -1690,11 +1690,11 @@ #ifdef COMPILER1 FastTLABRefill = false; #endif - FLAG_SET_DEFAULT(ParallelGCThreads, - Abstract_VM_Version::parallel_worker_threads()); + FLAG_SET_DEFAULT(ParallelGCThreads, Abstract_VM_Version::parallel_worker_threads()); if (ParallelGCThreads == 0) { - FLAG_SET_DEFAULT(ParallelGCThreads, - Abstract_VM_Version::parallel_worker_threads()); + assert(!FLAG_IS_DEFAULT(ParallelGCThreads), "The default value for ParallelGCThreads should not be 0."); + jio_fprintf(defaultStream::error_stream(), "The G1 GC can not be combined with -XX:ParallelGCThreads=0\n"); + vm_exit(1); } #if INCLUDE_ALL_GCS diff --git a/test/gc/arguments/TestParallelGCThreads.java b/test/gc/arguments/TestParallelGCThreads.java new file mode 100644 --- /dev/null +++ b/test/gc/arguments/TestParallelGCThreads.java @@ -0,0 +1,67 @@ +/* +* 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 TestParallelGCThreads + * @key gc + * @bug 8059527 + * @summary Tests argument processing for ParallelGCThreads + * @library /testlibrary + * @build TestParallelGCThreads FlagsValue + * @run main/othervm TestParallelGCThreads + */ + +import com.oracle.java.testlibrary.*; + +public class TestParallelGCThreads { + + public static void main(String args[]) throws Exception { + + // For each parallel collector (G1, Parallel, ParNew/CMS) + for (String gc : new String[] {"G1", "Parallel", "ConcMarkSweep"}) { + + // Make sure the VM does not allow ParallelGCThreads set to 0 + String[] flags = new String[] {"-XX:+Use" + gc + "GC", "-XX:ParallelGCThreads=0", "-XX:+PrintFlagsFinal", "-version"}; + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(flags); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(1); + + // Do some basic testing to ensure the flag updates the count + for (long i = 1; i <= 3; i++) { + flags = new String[] {"-XX:+Use" + gc + "GC", "-XX:ParallelGCThreads=" + i, "-XX:+PrintFlagsFinal", "-version"}; + long count = getParallelGCThreadCount(flags); + if (count != i) { + throw new RuntimeException("Specifying ParallelGCThreads=" + i + " for " + gc + "GC does not set the thread count properly! Count found was " + count); + } + } + } + } + + public static long getParallelGCThreadCount(String flags[]) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(flags); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + String stdout = output.getStdout(); + return FlagsValue.getFlagLongValue("ParallelGCThreads", stdout); + } +}