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();
|