1.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Tue Nov 22 04:47:10 2011 -0500 1.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Tue Aug 09 10:16:01 2011 -0700 1.3 @@ -181,28 +181,29 @@ 1.4 void PSRefProcTaskExecutor::execute(ProcessTask& task) 1.5 { 1.6 GCTaskQueue* q = GCTaskQueue::create(); 1.7 - for(uint i=0; i<ParallelGCThreads; i++) { 1.8 + GCTaskManager* manager = ParallelScavengeHeap::gc_task_manager(); 1.9 + for(uint i=0; i < manager->active_workers(); i++) { 1.10 q->enqueue(new PSRefProcTaskProxy(task, i)); 1.11 } 1.12 - ParallelTaskTerminator terminator( 1.13 - ParallelScavengeHeap::gc_task_manager()->workers(), 1.14 + ParallelTaskTerminator terminator(manager->active_workers(), 1.15 (TaskQueueSetSuper*) PSPromotionManager::stack_array_depth()); 1.16 - if (task.marks_oops_alive() && ParallelGCThreads > 1) { 1.17 - for (uint j=0; j<ParallelGCThreads; j++) { 1.18 + if (task.marks_oops_alive() && manager->active_workers() > 1) { 1.19 + for (uint j = 0; j < manager->active_workers(); j++) { 1.20 q->enqueue(new StealTask(&terminator)); 1.21 } 1.22 } 1.23 - ParallelScavengeHeap::gc_task_manager()->execute_and_wait(q); 1.24 + manager->execute_and_wait(q); 1.25 } 1.26 1.27 1.28 void PSRefProcTaskExecutor::execute(EnqueueTask& task) 1.29 { 1.30 GCTaskQueue* q = GCTaskQueue::create(); 1.31 - for(uint i=0; i<ParallelGCThreads; i++) { 1.32 + GCTaskManager* manager = ParallelScavengeHeap::gc_task_manager(); 1.33 + for(uint i=0; i < manager->active_workers(); i++) { 1.34 q->enqueue(new PSRefEnqueueTaskProxy(task, i)); 1.35 } 1.36 - ParallelScavengeHeap::gc_task_manager()->execute_and_wait(q); 1.37 + manager->execute_and_wait(q); 1.38 } 1.39 1.40 // This method contains all heap specific policy for invoking scavenge. 1.41 @@ -375,6 +376,14 @@ 1.42 // Release all previously held resources 1.43 gc_task_manager()->release_all_resources(); 1.44 1.45 + // Set the number of GC threads to be used in this collection 1.46 + gc_task_manager()->set_active_gang(); 1.47 + gc_task_manager()->task_idle_workers(); 1.48 + // Get the active number of workers here and use that value 1.49 + // throughout the methods. 1.50 + uint active_workers = gc_task_manager()->active_workers(); 1.51 + heap->set_par_threads(active_workers); 1.52 + 1.53 PSPromotionManager::pre_scavenge(); 1.54 1.55 // We'll use the promotion manager again later. 1.56 @@ -385,8 +394,9 @@ 1.57 1.58 GCTaskQueue* q = GCTaskQueue::create(); 1.59 1.60 - for(uint i=0; i<ParallelGCThreads; i++) { 1.61 - q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i)); 1.62 + uint stripe_total = active_workers; 1.63 + for(uint i=0; i < stripe_total; i++) { 1.64 + q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i, stripe_total)); 1.65 } 1.66 1.67 q->enqueue(new SerialOldToYoungRootsTask(perm_gen, perm_top)); 1.68 @@ -403,10 +413,10 @@ 1.69 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache)); 1.70 1.71 ParallelTaskTerminator terminator( 1.72 - gc_task_manager()->workers(), 1.73 + active_workers, 1.74 (TaskQueueSetSuper*) promotion_manager->stack_array_depth()); 1.75 - if (ParallelGCThreads>1) { 1.76 - for (uint j=0; j<ParallelGCThreads; j++) { 1.77 + if (active_workers > 1) { 1.78 + for (uint j = 0; j < active_workers; j++) { 1.79 q->enqueue(new StealTask(&terminator)); 1.80 } 1.81 } 1.82 @@ -419,6 +429,7 @@ 1.83 // Process reference objects discovered during scavenge 1.84 { 1.85 reference_processor()->setup_policy(false); // not always_clear 1.86 + reference_processor()->set_active_mt_degree(active_workers); 1.87 PSKeepAliveClosure keep_alive(promotion_manager); 1.88 PSEvacuateFollowersClosure evac_followers(promotion_manager); 1.89 if (reference_processor()->processing_is_mt()) { 1.90 @@ -622,6 +633,8 @@ 1.91 // Track memory usage and detect low memory 1.92 MemoryService::track_memory_usage(); 1.93 heap->update_counters(); 1.94 + 1.95 + gc_task_manager()->release_idle_workers(); 1.96 } 1.97 1.98 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) { 1.99 @@ -804,6 +817,7 @@ 1.100 1.101 // Initialize ref handling object for scavenging. 1.102 MemRegion mr = young_gen->reserved(); 1.103 + 1.104 _ref_processor = 1.105 new ReferenceProcessor(mr, // span 1.106 ParallelRefProcEnabled && (ParallelGCThreads > 1), // mt processing