8005396: Use ParNew with only one thread instead of DefNew as default for CMS on single CPU machines
Reviewed-by: jmasa, jcoomes
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Sun Dec 30 08:47:52 2012 +0100
@@ -56,7 +56,7 @@
if (_generations == NULL)
vm_exit_during_initialization("Unable to allocate gen spec");
- if (ParNewGeneration::in_use()) {
+ if (UseParNewGC) {
if (UseAdaptiveSizePolicy) {
_generations[0] = new GenerationSpec(Generation::ASParNew,
_initial_gen0_size, _max_gen0_size);
@@ -96,7 +96,7 @@
void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
// initialize the policy counters - 2 collectors, 3 generations
- if (ParNewGeneration::in_use()) {
+ if (UseParNewGC) {
_gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
}
else {
@@ -119,7 +119,7 @@
assert(size_policy() != NULL, "A size policy is required");
// initialize the policy counters - 2 collectors, 3 generations
- if (ParNewGeneration::in_use()) {
+ if (UseParNewGC) {
_gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
size_policy());
}
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Sun Dec 30 08:47:52 2012 +0100
@@ -1623,7 +1623,3 @@
const char* ParNewGeneration::name() const {
return "par new generation";
}
-
-bool ParNewGeneration::in_use() {
- return UseParNewGC && ParallelGCThreads > 0;
-}
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Sun Dec 30 08:47:52 2012 +0100
@@ -361,8 +361,6 @@
delete _task_queues;
}
- static bool in_use();
-
virtual void ref_processor_init();
virtual Generation::Name kind() { return Generation::ParNew; }
virtual const char* name() const;
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Sun Dec 30 08:47:52 2012 +0100
@@ -827,7 +827,7 @@
if (_generations == NULL)
vm_exit_during_initialization("Unable to allocate gen spec");
- if (UseParNewGC && ParallelGCThreads > 0) {
+ if (UseParNewGC) {
_generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
} else {
_generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
@@ -840,10 +840,9 @@
void MarkSweepPolicy::initialize_gc_policy_counters() {
// initialize the policy counters - 2 collectors, 3 generations
- if (UseParNewGC && ParallelGCThreads > 0) {
+ if (UseParNewGC) {
_gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
- }
- else {
+ } else {
_gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3);
}
}
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp Sun Dec 30 08:47:52 2012 +0100
@@ -62,7 +62,7 @@
_virtual_space.reserved_size(),
_the_space, _gen_counters);
#ifndef SERIALGC
- if (UseParNewGC && ParallelGCThreads > 0) {
+ if (UseParNewGC) {
typedef ParGCAllocBufferWithBOT* ParGCAllocBufferWithBOTPtr;
_alloc_buffers = NEW_C_HEAP_ARRAY(ParGCAllocBufferWithBOTPtr,
ParallelGCThreads, mtGC);
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jan 03 16:28:22 2013 -0800
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Sun Dec 30 08:47:52 2012 +0100
@@ -1083,10 +1083,6 @@
}
}
-// If the user has chosen ParallelGCThreads > 0, we set UseParNewGC
-// if it's not explictly set or unset. If the user has chosen
-// UseParNewGC and not explicitly set ParallelGCThreads we
-// set it, unless this is a single cpu machine.
void Arguments::set_parnew_gc_flags() {
assert(!UseSerialGC && !UseParallelOldGC && !UseParallelGC && !UseG1GC,
"control point invariant");
@@ -1095,42 +1091,41 @@
// Turn off AdaptiveSizePolicy for parnew until it is complete.
disable_adaptive_size_policy("UseParNewGC");
- if (ParallelGCThreads == 0) {
- FLAG_SET_DEFAULT(ParallelGCThreads,
- Abstract_VM_Version::parallel_worker_threads());
- if (ParallelGCThreads == 1) {
- FLAG_SET_DEFAULT(UseParNewGC, false);
- FLAG_SET_DEFAULT(ParallelGCThreads, 0);
- }
+ if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
+ FLAG_SET_DEFAULT(ParallelGCThreads, Abstract_VM_Version::parallel_worker_threads());
+ assert(ParallelGCThreads > 0, "We should always have at least one thread by default");
+ } else if (ParallelGCThreads == 0) {
+ jio_fprintf(defaultStream::error_stream(),
+ "The ParNew GC can not be combined with -XX:ParallelGCThreads=0\n");
+ vm_exit(1);
+ }
+
+ // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 respectively,
+ // these settings are default for Parallel Scavenger. For ParNew+Tenured configuration
+ // we set them to 1024 and 1024.
+ // See CR 6362902.
+ if (FLAG_IS_DEFAULT(YoungPLABSize)) {
+ FLAG_SET_DEFAULT(YoungPLABSize, (intx)1024);
}
- if (UseParNewGC) {
- // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 respectively,
- // these settings are default for Parallel Scavenger. For ParNew+Tenured configuration
- // we set them to 1024 and 1024.
- // See CR 6362902.
- if (FLAG_IS_DEFAULT(YoungPLABSize)) {
- FLAG_SET_DEFAULT(YoungPLABSize, (intx)1024);
+ if (FLAG_IS_DEFAULT(OldPLABSize)) {
+ FLAG_SET_DEFAULT(OldPLABSize, (intx)1024);
+ }
+
+ // AlwaysTenure flag should make ParNew promote all at first collection.
+ // See CR 6362902.
+ if (AlwaysTenure) {
+ FLAG_SET_CMDLINE(uintx, MaxTenuringThreshold, 0);
+ }
+ // When using compressed oops, we use local overflow stacks,
+ // rather than using a global overflow list chained through
+ // the klass word of the object's pre-image.
+ if (UseCompressedOops && !ParGCUseLocalOverflow) {
+ if (!FLAG_IS_DEFAULT(ParGCUseLocalOverflow)) {
+ warning("Forcing +ParGCUseLocalOverflow: needed if using compressed references");
}
- if (FLAG_IS_DEFAULT(OldPLABSize)) {
- FLAG_SET_DEFAULT(OldPLABSize, (intx)1024);
- }
-
- // AlwaysTenure flag should make ParNew promote all at first collection.
- // See CR 6362902.
- if (AlwaysTenure) {
- FLAG_SET_CMDLINE(uintx, MaxTenuringThreshold, 0);
- }
- // When using compressed oops, we use local overflow stacks,
- // rather than using a global overflow list chained through
- // the klass word of the object's pre-image.
- if (UseCompressedOops && !ParGCUseLocalOverflow) {
- if (!FLAG_IS_DEFAULT(ParGCUseLocalOverflow)) {
- warning("Forcing +ParGCUseLocalOverflow: needed if using compressed references");
- }
- FLAG_SET_DEFAULT(ParGCUseLocalOverflow, true);
- }
- assert(ParGCUseLocalOverflow || !UseCompressedOops, "Error");
+ FLAG_SET_DEFAULT(ParGCUseLocalOverflow, true);
}
+ assert(ParGCUseLocalOverflow || !UseCompressedOops, "Error");
}
// Adjust some sizes to suit CMS and/or ParNew needs; these work well on