src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp

changeset 3294
bca17e38de00
parent 3175
4dfb2df418f2
child 3499
aa3d708d67c4
     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

mercurial