18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "code/codeCache.hpp"
27 #include "gc/g1/g1CollectedHeap.hpp"
28 #include "gc/g1/g1CollectorPolicy.hpp"
29 #include "gc/g1/g1FullCollector.hpp"
30 #include "gc/g1/g1FullGCAdjustTask.hpp"
31 #include "gc/g1/g1FullGCCompactTask.hpp"
32 #include "gc/g1/g1FullGCMarker.inline.hpp"
33 #include "gc/g1/g1FullGCMarkTask.hpp"
34 #include "gc/g1/g1FullGCPrepareTask.hpp"
35 #include "gc/g1/g1FullGCReferenceProcessorExecutor.hpp"
36 #include "gc/g1/g1FullGCScope.hpp"
37 #include "gc/g1/g1OopClosures.hpp"
38 #include "gc/g1/g1StringDedup.hpp"
39 #include "gc/shared/gcTraceTime.inline.hpp"
40 #include "gc/shared/preservedMarks.hpp"
41 #include "gc/shared/referenceProcessor.hpp"
42 #include "gc/shared/weakProcessor.hpp"
43 #include "logging/log.hpp"
44 #include "runtime/biasedLocking.hpp"
45 #include "utilities/debug.hpp"
46
47 static void clear_and_activate_derived_pointers() {
48 #if COMPILER2_OR_JVMCI
49 DerivedPointerTable::clear();
50 #endif
51 }
52
53 static void deactivate_derived_pointers() {
54 #if COMPILER2_OR_JVMCI
55 DerivedPointerTable::set_active(false);
56 #endif
57 }
58
59 static void update_derived_pointers() {
60 #if COMPILER2_OR_JVMCI
61 DerivedPointerTable::update_pointers();
62 #endif
63 }
64
65 G1FullCollector::G1FullCollector(G1FullGCScope* scope,
66 ReferenceProcessor* reference_processor,
67 G1CMBitMap* bitmap,
68 uint workers) :
69 _scope(scope),
70 _num_workers(workers),
71 _mark_bitmap(bitmap),
72 _oop_queue_set(_num_workers),
73 _array_queue_set(_num_workers),
74 _preserved_marks_set(true),
75 _reference_processor(reference_processor),
76 _serial_compaction_point(),
77 _is_alive(_mark_bitmap),
78 _is_alive_mutator(_reference_processor, &_is_alive) {
79 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
80
81 _preserved_marks_set.init(_num_workers);
82 _markers = NEW_C_HEAP_ARRAY(G1FullGCMarker*, _num_workers, mtGC);
83 _compaction_points = NEW_C_HEAP_ARRAY(G1FullGCCompactionPoint*, _num_workers, mtGC);
84 for (uint i = 0; i < _num_workers; i++) {
85 _markers[i] = new G1FullGCMarker(i, _preserved_marks_set.get(i), mark_bitmap());
86 _compaction_points[i] = new G1FullGCCompactionPoint();
87 _oop_queue_set.register_queue(i, marker(i)->oop_stack());
88 _array_queue_set.register_queue(i, marker(i)->objarray_stack());
89 }
90 }
91
92 G1FullCollector::~G1FullCollector() {
93 for (uint i = 0; i < _num_workers; i++) {
94 delete _markers[i];
95 delete _compaction_points[i];
96 }
97 FREE_C_HEAP_ARRAY(G1FullGCMarker*, _markers);
98 FREE_C_HEAP_ARRAY(G1FullGCCompactionPoint*, _compaction_points);
99 }
100
101 void G1FullCollector::prepare_collection() {
102 _reference_processor->enable_discovery();
103 _reference_processor->setup_policy(scope()->should_clear_soft_refs());
104
105 // When collecting the permanent generation Method*s may be moving,
106 // so we either have to flush all bcp data or convert it into bci.
107 CodeCache::gc_prologue();
108
109 // We should save the marks of the currently locked biased monitors.
110 // The marking doesn't preserve the marks of biased objects.
111 BiasedLocking::preserve_marks();
112
113 // Clear and activate derived pointer collection.
114 clear_and_activate_derived_pointers();
115 }
116
117 void G1FullCollector::collect() {
118 phase1_mark_live_objects();
119 verify_after_marking();
120
121 // Don't add any more derived pointers during later phases
122 deactivate_derived_pointers();
123
124 phase2_prepare_compaction();
125
126 phase3_adjust_pointers();
127
128 phase4_do_compaction();
129 }
130
131 void G1FullCollector::complete_collection() {
132 // Restore all marks.
133 restore_marks();
134
135 // When the pointers have been adjusted and moved, we can
136 // update the derived pointer table.
137 update_derived_pointers();
138
139 BiasedLocking::restore_marks();
140 CodeCache::gc_epilogue();
141 JvmtiExport::gc_epilogue();
142 }
143
144 void G1FullCollector::phase1_mark_live_objects() {
145 // Recursively traverse all live objects and mark them.
146 GCTraceTime(Info, gc, phases) info("Phase 1: Mark live objects", scope()->timer());
147
148 // Do the actual marking.
149 G1FullGCMarkTask marking_task(this);
150 run_task(&marking_task);
151
152 // Process references discovered during marking.
153 G1FullGCReferenceProcessingExecutor reference_processing(this);
154 reference_processing.execute(scope()->timer(), scope()->tracer());
155
156 // Weak oops cleanup.
157 {
158 GCTraceTime(Debug, gc, phases) trace("Phase 1: Weak Processing", scope()->timer());
159 WeakProcessor::weak_oops_do(&_is_alive, &do_nothing_cl);
160 }
161
|
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "code/codeCache.hpp"
27 #include "gc/g1/g1CollectedHeap.hpp"
28 #include "gc/g1/g1CollectorPolicy.hpp"
29 #include "gc/g1/g1FullCollector.hpp"
30 #include "gc/g1/g1FullGCAdjustTask.hpp"
31 #include "gc/g1/g1FullGCCompactTask.hpp"
32 #include "gc/g1/g1FullGCMarker.inline.hpp"
33 #include "gc/g1/g1FullGCMarkTask.hpp"
34 #include "gc/g1/g1FullGCPrepareTask.hpp"
35 #include "gc/g1/g1FullGCReferenceProcessorExecutor.hpp"
36 #include "gc/g1/g1FullGCScope.hpp"
37 #include "gc/g1/g1OopClosures.hpp"
38 #include "gc/g1/g1Policy.hpp"
39 #include "gc/g1/g1StringDedup.hpp"
40 #include "gc/shared/gcTraceTime.inline.hpp"
41 #include "gc/shared/preservedMarks.hpp"
42 #include "gc/shared/referenceProcessor.hpp"
43 #include "gc/shared/weakProcessor.hpp"
44 #include "logging/log.hpp"
45 #include "runtime/biasedLocking.hpp"
46 #include "utilities/debug.hpp"
47
48 static void clear_and_activate_derived_pointers() {
49 #if COMPILER2_OR_JVMCI
50 DerivedPointerTable::clear();
51 #endif
52 }
53
54 static void deactivate_derived_pointers() {
55 #if COMPILER2_OR_JVMCI
56 DerivedPointerTable::set_active(false);
57 #endif
58 }
59
60 static void update_derived_pointers() {
61 #if COMPILER2_OR_JVMCI
62 DerivedPointerTable::update_pointers();
63 #endif
64 }
65
66 G1CMBitMap* G1FullCollector::mark_bitmap() {
67 return heap()->concurrent_mark()->next_mark_bitmap();
68 }
69
70 ReferenceProcessor* G1FullCollector::reference_processor() {
71 return heap()->ref_processor_stw();
72 }
73
74 G1FullCollector::G1FullCollector(G1CollectedHeap* heap, bool explicit_gc, bool clear_soft_refs) :
75 _heap(heap),
76 _scope(explicit_gc, clear_soft_refs),
77 _num_workers(_heap->workers()->active_workers()),
78 _oop_queue_set(_num_workers),
79 _array_queue_set(_num_workers),
80 _preserved_marks_set(true),
81 _serial_compaction_point(),
82 _is_alive(mark_bitmap()),
83 _is_alive_mutator(reference_processor(), &_is_alive) {
84 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
85
86 _preserved_marks_set.init(_num_workers);
87 _markers = NEW_C_HEAP_ARRAY(G1FullGCMarker*, _num_workers, mtGC);
88 _compaction_points = NEW_C_HEAP_ARRAY(G1FullGCCompactionPoint*, _num_workers, mtGC);
89 for (uint i = 0; i < _num_workers; i++) {
90 _markers[i] = new G1FullGCMarker(i, _preserved_marks_set.get(i), mark_bitmap());
91 _compaction_points[i] = new G1FullGCCompactionPoint();
92 _oop_queue_set.register_queue(i, marker(i)->oop_stack());
93 _array_queue_set.register_queue(i, marker(i)->objarray_stack());
94 }
95 }
96
97 G1FullCollector::~G1FullCollector() {
98 for (uint i = 0; i < _num_workers; i++) {
99 delete _markers[i];
100 delete _compaction_points[i];
101 }
102 FREE_C_HEAP_ARRAY(G1FullGCMarker*, _markers);
103 FREE_C_HEAP_ARRAY(G1FullGCCompactionPoint*, _compaction_points);
104 }
105
106 void G1FullCollector::prepare_collection() {
107 heap()->g1_policy()->record_full_collection_start();
108
109 heap()->print_heap_before_gc();
110 heap()->print_heap_regions();
111
112 heap()->abort_concurrent_cycle();
113 heap()->verify_before_full_collection(scope()->is_explicit_gc());
114
115 heap()->gc_prologue(true);
116 heap()->prepare_heap_for_full_collection();
117
118 reference_processor()->enable_discovery();
119 reference_processor()->setup_policy(scope()->should_clear_soft_refs());
120
121 // When collecting the permanent generation Method*s may be moving,
122 // so we either have to flush all bcp data or convert it into bci.
123 CodeCache::gc_prologue();
124
125 // We should save the marks of the currently locked biased monitors.
126 // The marking doesn't preserve the marks of biased objects.
127 BiasedLocking::preserve_marks();
128
129 // Clear and activate derived pointer collection.
130 clear_and_activate_derived_pointers();
131 }
132
133 void G1FullCollector::collect() {
134 phase1_mark_live_objects();
135 verify_after_marking();
136
137 // Don't add any more derived pointers during later phases
138 deactivate_derived_pointers();
139
140 phase2_prepare_compaction();
141
142 phase3_adjust_pointers();
143
144 phase4_do_compaction();
145 }
146
147 void G1FullCollector::complete_collection() {
148 // Restore all marks.
149 restore_marks();
150
151 // When the pointers have been adjusted and moved, we can
152 // update the derived pointer table.
153 update_derived_pointers();
154
155 BiasedLocking::restore_marks();
156 CodeCache::gc_epilogue();
157 JvmtiExport::gc_epilogue();
158
159 heap()->prepare_heap_for_mutators();
160
161 heap()->g1_policy()->record_full_collection_end();
162 heap()->gc_epilogue(true);
163
164 heap()->verify_after_full_collection();
165
166 heap()->print_heap_after_full_collection(scope()->heap_transition());
167 }
168
169 void G1FullCollector::phase1_mark_live_objects() {
170 // Recursively traverse all live objects and mark them.
171 GCTraceTime(Info, gc, phases) info("Phase 1: Mark live objects", scope()->timer());
172
173 // Do the actual marking.
174 G1FullGCMarkTask marking_task(this);
175 run_task(&marking_task);
176
177 // Process references discovered during marking.
178 G1FullGCReferenceProcessingExecutor reference_processing(this);
179 reference_processing.execute(scope()->timer(), scope()->tracer());
180
181 // Weak oops cleanup.
182 {
183 GCTraceTime(Debug, gc, phases) trace("Phase 1: Weak Processing", scope()->timer());
184 WeakProcessor::weak_oops_do(&_is_alive, &do_nothing_cl);
185 }
186
|