< prev index next >

src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp

Print this page
rev 14452 : [mq]: onebitmap.patch


  31 #include "gc/shenandoah/shenandoahPartialGC.hpp"
  32 #include "gc/shenandoah/shenandoahUtils.hpp"
  33 #include "gc/shenandoah/shenandoahVerifier.hpp"
  34 #include "gc/shenandoah/shenandoahWorkGroup.hpp"
  35 #include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
  36 #include "gc/shenandoah/vm_operations_shenandoah.hpp"
  37 
  38 void VM_ShenandoahInitMark::doit() {
  39   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::init_mark, SvcGCMarker::OTHER);
  40 
  41   ShenandoahHeap* sh = ShenandoahHeap::heap();
  42 
  43   GCTraceTime(Info, gc) time("Pause Init Mark", sh->gc_timer());
  44   WorkGang* workers = sh->workers();
  45 
  46   // Calculate workers for initial marking
  47   uint nworkers = ShenandoahWorkerPolicy::calc_workers_for_init_marking();
  48 
  49   ShenandoahWorkerScope scope(workers, nworkers);
  50 
  51   assert(sh->is_next_bitmap_clear(), "need clear marking bitmap");


  52 
  53   sh->start_concurrent_marking();
  54 }
  55 
  56 void VM_ShenandoahFullGC::doit() {
  57   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::full_gc, SvcGCMarker::FULL);
  58   ShenandoahMarkCompact::do_mark_compact(_gc_cause);
  59 }
  60 
  61 bool VM_ShenandoahReferenceOperation::doit_prologue() {
  62   Heap_lock->lock();
  63   return true;
  64 }
  65 
  66 void VM_ShenandoahReferenceOperation::doit_epilogue() {
  67   if (Universe::has_reference_pending_list()) {
  68     Heap_lock->notify_all();
  69   }
  70   Heap_lock->unlock();
  71 }
  72 
  73 void VM_ShenandoahFinalMarkStartEvac::doit() {
  74   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::final_mark, SvcGCMarker::OTHER);
  75 
  76   ShenandoahHeap *sh = ShenandoahHeap::heap();
  77 
  78   // It is critical that we
  79   // evacuate roots right after finishing marking, so that we don't
  80   // get unmarked objects in the roots.
  81   // Setup workers for final marking
  82   WorkGang* workers = sh->workers();
  83   uint n_workers = ShenandoahWorkerPolicy::calc_workers_for_final_marking();
  84   ShenandoahWorkerScope scope(workers, n_workers);
  85 
  86   if (! sh->cancelled_concgc()) {
  87     GCTraceTime(Info, gc) time("Pause Final Mark", sh->gc_timer(), GCCause::_no_gc, true);
  88     sh->concurrentMark()->finish_mark_from_roots();

  89     sh->stop_concurrent_marking();
  90 
  91     {
  92       ShenandoahGCPhase prepare_evac(ShenandoahPhaseTimings::prepare_evac);
  93       sh->prepare_for_concurrent_evacuation();
  94     }
  95 
  96     // If collection set has candidates, start evacuation.
  97     // Otherwise, bypass the rest of the cycle.
  98     if (!sh->collection_set()->is_empty()) {
  99       sh->set_evacuation_in_progress_at_safepoint(true);
 100       // From here on, we need to update references.
 101       sh->set_need_update_refs(true);
 102 
 103       ShenandoahGCPhase init_evac(ShenandoahPhaseTimings::init_evac);
 104       sh->evacuate_and_update_roots();
 105     }
 106   } else {
 107     GCTraceTime(Info, gc) time("Cancel Concurrent Mark", sh->gc_timer(), GCCause::_no_gc, true);
 108     sh->concurrentMark()->cancel();




  31 #include "gc/shenandoah/shenandoahPartialGC.hpp"
  32 #include "gc/shenandoah/shenandoahUtils.hpp"
  33 #include "gc/shenandoah/shenandoahVerifier.hpp"
  34 #include "gc/shenandoah/shenandoahWorkGroup.hpp"
  35 #include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
  36 #include "gc/shenandoah/vm_operations_shenandoah.hpp"
  37 
  38 void VM_ShenandoahInitMark::doit() {
  39   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::init_mark, SvcGCMarker::OTHER);
  40 
  41   ShenandoahHeap* sh = ShenandoahHeap::heap();
  42 
  43   GCTraceTime(Info, gc) time("Pause Init Mark", sh->gc_timer());
  44   WorkGang* workers = sh->workers();
  45 
  46   // Calculate workers for initial marking
  47   uint nworkers = ShenandoahWorkerPolicy::calc_workers_for_init_marking();
  48 
  49   ShenandoahWorkerScope scope(workers, nworkers);
  50 
  51   assert(sh->is_bitmap_clear(), "need clear marking bitmap");
  52 
  53   sh->set_bitmap_valid(false);
  54 
  55   sh->start_concurrent_marking();
  56 }
  57 
  58 void VM_ShenandoahFullGC::doit() {
  59   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::full_gc, SvcGCMarker::FULL);
  60   ShenandoahMarkCompact::do_mark_compact(_gc_cause);
  61 }
  62 
  63 bool VM_ShenandoahReferenceOperation::doit_prologue() {
  64   Heap_lock->lock();
  65   return true;
  66 }
  67 
  68 void VM_ShenandoahReferenceOperation::doit_epilogue() {
  69   if (Universe::has_reference_pending_list()) {
  70     Heap_lock->notify_all();
  71   }
  72   Heap_lock->unlock();
  73 }
  74 
  75 void VM_ShenandoahFinalMarkStartEvac::doit() {
  76   ShenandoahGCPauseMark mark(_gc_id, ShenandoahPhaseTimings::final_mark, SvcGCMarker::OTHER);
  77 
  78   ShenandoahHeap *sh = ShenandoahHeap::heap();
  79 
  80   // It is critical that we
  81   // evacuate roots right after finishing marking, so that we don't
  82   // get unmarked objects in the roots.
  83   // Setup workers for final marking
  84   WorkGang* workers = sh->workers();
  85   uint n_workers = ShenandoahWorkerPolicy::calc_workers_for_final_marking();
  86   ShenandoahWorkerScope scope(workers, n_workers);
  87 
  88   if (! sh->cancelled_concgc()) {
  89     GCTraceTime(Info, gc) time("Pause Final Mark", sh->gc_timer(), GCCause::_no_gc, true);
  90     sh->concurrentMark()->finish_mark_from_roots();
  91     sh->set_bitmap_valid(true);
  92     sh->stop_concurrent_marking();
  93 
  94     {
  95       ShenandoahGCPhase prepare_evac(ShenandoahPhaseTimings::prepare_evac);
  96       sh->prepare_for_concurrent_evacuation();
  97     }
  98 
  99     // If collection set has candidates, start evacuation.
 100     // Otherwise, bypass the rest of the cycle.
 101     if (!sh->collection_set()->is_empty()) {
 102       sh->set_evacuation_in_progress_at_safepoint(true);
 103       // From here on, we need to update references.
 104       sh->set_need_update_refs(true);
 105 
 106       ShenandoahGCPhase init_evac(ShenandoahPhaseTimings::init_evac);
 107       sh->evacuate_and_update_roots();
 108     }
 109   } else {
 110     GCTraceTime(Info, gc) time("Cancel Concurrent Mark", sh->gc_timer(), GCCause::_no_gc, true);
 111     sh->concurrentMark()->cancel();


< prev index next >