--- old/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp 2015-04-21 09:44:30.277312475 -0400 +++ new/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp 2015-04-21 09:44:29.725281070 -0400 @@ -193,8 +193,9 @@ (!FLAG_IS_DEFAULT(ParallelGCThreads) && !ForceDynamicNumberOfGCThreads)) { new_active_workers = total_workers; } else { + uintx min_workers = (total_workers == 1) ? 1 : 2; new_active_workers = calc_default_active_workers(total_workers, - 2, /* Minimum number of workers */ + min_workers, active_workers, application_workers); } --- old/test/gc/ergonomics/TestDynamicNumberOfGCThreads.java 2015-04-21 09:44:32.493438549 -0400 +++ new/test/gc/ergonomics/TestDynamicNumberOfGCThreads.java 2015-04-21 09:44:31.733395311 -0400 @@ -32,26 +32,42 @@ import com.oracle.java.testlibrary.ProcessTools; import com.oracle.java.testlibrary.OutputAnalyzer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; public class TestDynamicNumberOfGCThreads { public static void main(String[] args) throws Exception { - testDynamicNumberOfGCThreads("UseConcMarkSweepGC"); + testDynamicNumberOfGCThreads("UseConcMarkSweepGC", true); + testDynamicNumberOfGCThreads("UseConcMarkSweepGC", false); - testDynamicNumberOfGCThreads("UseG1GC"); + testDynamicNumberOfGCThreads("UseG1GC", true); + testDynamicNumberOfGCThreads("UseG1GC", false); - testDynamicNumberOfGCThreads("UseParallelGC"); + testDynamicNumberOfGCThreads("UseParallelGC", true); + testDynamicNumberOfGCThreads("UseParallelGC", false); } private static void verifyDynamicNumberOfGCThreads(OutputAnalyzer output) { + output.shouldHaveExitValue(0); // test should run succesfully output.shouldContain("new_active_workers"); - output.shouldHaveExitValue(0); } - private static void testDynamicNumberOfGCThreads(String gcFlag) throws Exception { + private static void testDynamicNumberOfGCThreads(String gcFlag, boolean emulate_uniprocessor) throws Exception { // UseDynamicNumberOfGCThreads and TraceDynamicGCThreads enabled - ProcessBuilder pb_enabled = - ProcessTools.createJavaProcessBuilder("-XX:+" + gcFlag, "-Xmx10M", "-XX:+PrintGCDetails", "-XX:+UseDynamicNumberOfGCThreads", "-XX:+TraceDynamicGCThreads", GCTest.class.getName()); + String[] defaults = {"-XX:+" + gcFlag, "-Xmx10M", "-XX:+PrintGCDetails", "-XX:+UseDynamicNumberOfGCThreads", "-XX:+TraceDynamicGCThreads", GCTest.class.getName()}; + ArrayList args = new ArrayList(); + Collections.addAll(args, defaults); + Arrays.asList(defaults); + // Ensure it works on uniprocessors or if user specifies -XX:ParallelGCThread=1. + if (emulate_uniprocessor) { + args.add(0, "-XX:+ForceDynamicNumberOfGCThreads"); + args.add(0, "-XX:ParallelGCThreads=1"); + } + String[] finalArgs = new String[args.size()]; + finalArgs = args.toArray(finalArgs); + ProcessBuilder pb_enabled = ProcessTools.createJavaProcessBuilder(finalArgs); verifyDynamicNumberOfGCThreads(new OutputAnalyzer(pb_enabled.start())); }