hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
changeset 13926 289339903fcf
parent 13876 8d0c8857ca32
child 14074 8cafb11da0cd
equal deleted inserted replaced
13925:37f75ba502b1 13926:289339903fcf
  4149     _old_gc_alloc_region.set(retained_region);
  4149     _old_gc_alloc_region.set(retained_region);
  4150     _hr_printer.reuse(retained_region);
  4150     _hr_printer.reuse(retained_region);
  4151   }
  4151   }
  4152 }
  4152 }
  4153 
  4153 
  4154 void G1CollectedHeap::release_gc_alloc_regions() {
  4154 void G1CollectedHeap::release_gc_alloc_regions(uint no_of_gc_workers) {
  4155   _survivor_gc_alloc_region.release();
  4155   _survivor_gc_alloc_region.release();
  4156   // If we have an old GC alloc region to release, we'll save it in
  4156   // If we have an old GC alloc region to release, we'll save it in
  4157   // _retained_old_gc_alloc_region. If we don't
  4157   // _retained_old_gc_alloc_region. If we don't
  4158   // _retained_old_gc_alloc_region will become NULL. This is what we
  4158   // _retained_old_gc_alloc_region will become NULL. This is what we
  4159   // want either way so no reason to check explicitly for either
  4159   // want either way so no reason to check explicitly for either
  4160   // condition.
  4160   // condition.
  4161   _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
  4161   _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
  4162 
  4162 
  4163   if (ResizePLAB) {
  4163   if (ResizePLAB) {
  4164     _survivor_plab_stats.adjust_desired_plab_sz();
  4164     _survivor_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
  4165     _old_plab_stats.adjust_desired_plab_sz();
  4165     _old_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
  4166   }
  4166   }
  4167 }
  4167 }
  4168 
  4168 
  4169 void G1CollectedHeap::abandon_gc_alloc_regions() {
  4169 void G1CollectedHeap::abandon_gc_alloc_regions() {
  4170   assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition");
  4170   assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition");
  5425     assert(pss.refs()->is_empty(), "should be");
  5425     assert(pss.refs()->is_empty(), "should be");
  5426   }
  5426   }
  5427 };
  5427 };
  5428 
  5428 
  5429 // Weak Reference processing during an evacuation pause (part 1).
  5429 // Weak Reference processing during an evacuation pause (part 1).
  5430 void G1CollectedHeap::process_discovered_references() {
  5430 void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
  5431   double ref_proc_start = os::elapsedTime();
  5431   double ref_proc_start = os::elapsedTime();
  5432 
  5432 
  5433   ReferenceProcessor* rp = _ref_processor_stw;
  5433   ReferenceProcessor* rp = _ref_processor_stw;
  5434   assert(rp->discovery_enabled(), "should have been enabled");
  5434   assert(rp->discovery_enabled(), "should have been enabled");
  5435 
  5435 
  5452   // We also need to do this copying before we process the reference
  5452   // We also need to do this copying before we process the reference
  5453   // objects discovered by the STW ref processor in case one of these
  5453   // objects discovered by the STW ref processor in case one of these
  5454   // referents points to another object which is also referenced by an
  5454   // referents points to another object which is also referenced by an
  5455   // object discovered by the STW ref processor.
  5455   // object discovered by the STW ref processor.
  5456 
  5456 
  5457   uint active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
       
  5458                         workers()->active_workers() : 1);
       
  5459 
       
  5460   assert(!G1CollectedHeap::use_parallel_gc_threads() ||
  5457   assert(!G1CollectedHeap::use_parallel_gc_threads() ||
  5461            active_workers == workers()->active_workers(),
  5458            no_of_gc_workers == workers()->active_workers(),
  5462            "Need to reset active_workers");
  5459            "Need to reset active GC workers");
  5463 
  5460 
  5464   set_par_threads(active_workers);
  5461   set_par_threads(no_of_gc_workers);
  5465   G1ParPreserveCMReferentsTask keep_cm_referents(this, active_workers, _task_queues);
  5462   G1ParPreserveCMReferentsTask keep_cm_referents(this,
       
  5463                                                  no_of_gc_workers,
       
  5464                                                  _task_queues);
  5466 
  5465 
  5467   if (G1CollectedHeap::use_parallel_gc_threads()) {
  5466   if (G1CollectedHeap::use_parallel_gc_threads()) {
  5468     workers()->run_task(&keep_cm_referents);
  5467     workers()->run_task(&keep_cm_referents);
  5469   } else {
  5468   } else {
  5470     keep_cm_referents.work(0);
  5469     keep_cm_referents.work(0);
  5526                                       &keep_alive,
  5525                                       &keep_alive,
  5527                                       &drain_queue,
  5526                                       &drain_queue,
  5528                                       NULL);
  5527                                       NULL);
  5529   } else {
  5528   } else {
  5530     // Parallel reference processing
  5529     // Parallel reference processing
  5531     assert(rp->num_q() == active_workers, "sanity");
  5530     assert(rp->num_q() == no_of_gc_workers, "sanity");
  5532     assert(active_workers <= rp->max_num_q(), "sanity");
  5531     assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
  5533 
  5532 
  5534     G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
  5533     G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
  5535     rp->process_discovered_references(&is_alive, &keep_alive, &drain_queue, &par_task_executor);
  5534     rp->process_discovered_references(&is_alive, &keep_alive, &drain_queue, &par_task_executor);
  5536   }
  5535   }
  5537 
  5536 
  5538   // We have completed copying any necessary live referent objects
  5537   // We have completed copying any necessary live referent objects
  5539   // (that were not copied during the actual pause) so we can
  5538   // (that were not copied during the actual pause) so we can
  5544   double ref_proc_time = os::elapsedTime() - ref_proc_start;
  5543   double ref_proc_time = os::elapsedTime() - ref_proc_start;
  5545   g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
  5544   g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
  5546 }
  5545 }
  5547 
  5546 
  5548 // Weak Reference processing during an evacuation pause (part 2).
  5547 // Weak Reference processing during an evacuation pause (part 2).
  5549 void G1CollectedHeap::enqueue_discovered_references() {
  5548 void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) {
  5550   double ref_enq_start = os::elapsedTime();
  5549   double ref_enq_start = os::elapsedTime();
  5551 
  5550 
  5552   ReferenceProcessor* rp = _ref_processor_stw;
  5551   ReferenceProcessor* rp = _ref_processor_stw;
  5553   assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
  5552   assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
  5554 
  5553 
  5558     // Serial reference processing...
  5557     // Serial reference processing...
  5559     rp->enqueue_discovered_references();
  5558     rp->enqueue_discovered_references();
  5560   } else {
  5559   } else {
  5561     // Parallel reference enqueuing
  5560     // Parallel reference enqueuing
  5562 
  5561 
  5563     uint active_workers = (ParallelGCThreads > 0 ? workers()->active_workers() : 1);
  5562     assert(no_of_gc_workers == workers()->active_workers(),
  5564     assert(active_workers == workers()->active_workers(),
  5563            "Need to reset active workers");
  5565            "Need to reset active_workers");
  5564     assert(rp->num_q() == no_of_gc_workers, "sanity");
  5566     assert(rp->num_q() == active_workers, "sanity");
  5565     assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
  5567     assert(active_workers <= rp->max_num_q(), "sanity");
  5566 
  5568 
  5567     G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
  5569     G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
       
  5570     rp->enqueue_discovered_references(&par_task_executor);
  5568     rp->enqueue_discovered_references(&par_task_executor);
  5571   }
  5569   }
  5572 
  5570 
  5573   rp->verify_no_references_recorded();
  5571   rp->verify_no_references_recorded();
  5574   assert(!rp->discovery_enabled(), "should have been disabled");
  5572   assert(!rp->discovery_enabled(), "should have been disabled");
  5656   // Process any discovered reference objects - we have
  5654   // Process any discovered reference objects - we have
  5657   // to do this _before_ we retire the GC alloc regions
  5655   // to do this _before_ we retire the GC alloc regions
  5658   // as we may have to copy some 'reachable' referent
  5656   // as we may have to copy some 'reachable' referent
  5659   // objects (and their reachable sub-graphs) that were
  5657   // objects (and their reachable sub-graphs) that were
  5660   // not copied during the pause.
  5658   // not copied during the pause.
  5661   process_discovered_references();
  5659   process_discovered_references(n_workers);
  5662 
  5660 
  5663   // Weak root processing.
  5661   // Weak root processing.
  5664   // Note: when JSR 292 is enabled and code blobs can contain
  5662   // Note: when JSR 292 is enabled and code blobs can contain
  5665   // non-perm oops then we will need to process the code blobs
  5663   // non-perm oops then we will need to process the code blobs
  5666   // here too.
  5664   // here too.
  5668     G1STWIsAliveClosure is_alive(this);
  5666     G1STWIsAliveClosure is_alive(this);
  5669     G1KeepAliveClosure keep_alive(this);
  5667     G1KeepAliveClosure keep_alive(this);
  5670     JNIHandles::weak_oops_do(&is_alive, &keep_alive);
  5668     JNIHandles::weak_oops_do(&is_alive, &keep_alive);
  5671   }
  5669   }
  5672 
  5670 
  5673   release_gc_alloc_regions();
  5671   release_gc_alloc_regions(n_workers);
  5674   g1_rem_set()->cleanup_after_oops_into_collection_set_do();
  5672   g1_rem_set()->cleanup_after_oops_into_collection_set_do();
  5675 
  5673 
  5676   concurrent_g1_refine()->clear_hot_cache();
  5674   concurrent_g1_refine()->clear_hot_cache();
  5677   concurrent_g1_refine()->set_use_cache(true);
  5675   concurrent_g1_refine()->set_use_cache(true);
  5678 
  5676 
  5692   // this after the card table is cleaned (and verified) as
  5690   // this after the card table is cleaned (and verified) as
  5693   // the act of enqueuing entries on to the pending list
  5691   // the act of enqueuing entries on to the pending list
  5694   // will log these updates (and dirty their associated
  5692   // will log these updates (and dirty their associated
  5695   // cards). We need these updates logged to update any
  5693   // cards). We need these updates logged to update any
  5696   // RSets.
  5694   // RSets.
  5697   enqueue_discovered_references();
  5695   enqueue_discovered_references(n_workers);
  5698 
  5696 
  5699   if (G1DeferredRSUpdate) {
  5697   if (G1DeferredRSUpdate) {
  5700     RedirtyLoggedCardTableEntryFastClosure redirty;
  5698     RedirtyLoggedCardTableEntryFastClosure redirty;
  5701     dirty_card_queue_set().set_closure(&redirty);
  5699     dirty_card_queue_set().set_closure(&redirty);
  5702     dirty_card_queue_set().apply_closure_to_all_completed_buffers();
  5700     dirty_card_queue_set().apply_closure_to_all_completed_buffers();