12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
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 "classfile/javaClasses.hpp"
27 #include "classfile/symbolTable.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/codeCache.hpp"
31 #include "code/icBuffer.hpp"
32 #include "gc/g1/g1Log.hpp"
33 #include "gc/g1/g1MarkSweep.hpp"
34 #include "gc/g1/g1RootProcessor.hpp"
35 #include "gc/g1/g1StringDedup.hpp"
36 #include "gc/serial/markSweep.inline.hpp"
37 #include "gc/shared/gcHeapSummary.hpp"
38 #include "gc/shared/gcLocker.hpp"
39 #include "gc/shared/gcTimer.hpp"
40 #include "gc/shared/gcTrace.hpp"
41 #include "gc/shared/gcTraceTime.hpp"
42 #include "gc/shared/genCollectedHeap.hpp"
43 #include "gc/shared/modRefBarrierSet.hpp"
44 #include "gc/shared/referencePolicy.hpp"
45 #include "gc/shared/space.hpp"
46 #include "oops/instanceRefKlass.hpp"
47 #include "oops/oop.inline.hpp"
48 #include "prims/jvmtiExport.hpp"
49 #include "runtime/atomic.inline.hpp"
50 #include "runtime/biasedLocking.hpp"
51 #include "runtime/fprofiler.hpp"
52 #include "runtime/synchronizer.hpp"
106 BiasedLocking::restore_marks();
107 GenMarkSweep::deallocate_stacks();
108
109 CodeCache::gc_epilogue();
110 JvmtiExport::gc_epilogue();
111
112 // refs processing: clean slate
113 GenMarkSweep::set_ref_processor(NULL);
114 }
115
116
117 void G1MarkSweep::allocate_stacks() {
118 GenMarkSweep::_preserved_count_max = 0;
119 GenMarkSweep::_preserved_marks = NULL;
120 GenMarkSweep::_preserved_count = 0;
121 }
122
123 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
124 bool clear_all_softrefs) {
125 // Recursively traverse all live objects and mark them
126 GCTraceTime tm("phase 1", G1Log::fine() && Verbose, true, gc_timer());
127
128 G1CollectedHeap* g1h = G1CollectedHeap::heap();
129
130 // Need cleared claim bits for the roots processing
131 ClassLoaderDataGraph::clear_claimed_marks();
132
133 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
134 {
135 G1RootProcessor root_processor(g1h, 1);
136 root_processor.process_strong_roots(&GenMarkSweep::follow_root_closure,
137 &GenMarkSweep::follow_cld_closure,
138 &follow_code_closure);
139 }
140
141 // Process reference objects found during marking
142 ReferenceProcessor* rp = GenMarkSweep::ref_processor();
143 assert(rp == g1h->ref_processor_stw(), "Sanity");
144
145 rp->setup_policy(clear_all_softrefs);
146 const ReferenceProcessorStats& stats =
166
167 // Delete entries for dead interned string and clean up unreferenced symbols in symbol table.
168 g1h->unlink_string_and_symbol_table(&GenMarkSweep::is_alive);
169
170 if (VerifyDuringGC) {
171 HandleMark hm; // handle scope
172 #if defined(COMPILER2) || INCLUDE_JVMCI
173 DerivedPointerTableDeactivate dpt_deact;
174 #endif
175 g1h->prepare_for_verify();
176 // Note: we can verify only the heap here. When an object is
177 // marked, the previous value of the mark word (including
178 // identity hash values, ages, etc) is preserved, and the mark
179 // word is set to markOop::marked_value - effectively removing
180 // any hash values from the mark word. These hash values are
181 // used when verifying the dictionaries and so removing them
182 // from the mark word can make verification of the dictionaries
183 // fail. At the end of the GC, the original mark word values
184 // (including hash values) are restored to the appropriate
185 // objects.
186 if (!VerifySilently) {
187 gclog_or_tty->print(" VerifyDuringGC:(full)[Verifying ");
188 }
189 g1h->verify(VerifySilently, VerifyOption_G1UseMarkWord);
190 if (!VerifySilently) {
191 gclog_or_tty->print_cr("]");
192 }
193 }
194
195 gc_tracer()->report_object_count_after_gc(&GenMarkSweep::is_alive);
196 }
197
198
199 void G1MarkSweep::mark_sweep_phase2() {
200 // Now all live objects are marked, compute the new object addresses.
201
202 // It is not required that we traverse spaces in the same order in
203 // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
204 // tracking expects us to do so. See comment under phase4.
205
206 GCTraceTime tm("phase 2", G1Log::fine() && Verbose, true, gc_timer());
207
208 prepare_compaction();
209 }
210
211 class G1AdjustPointersClosure: public HeapRegionClosure {
212 public:
213 bool doHeapRegion(HeapRegion* r) {
214 if (r->is_humongous()) {
215 if (r->is_starts_humongous()) {
216 // We must adjust the pointers on the single H object.
217 oop obj = oop(r->bottom());
218 // point all the oops to the new location
219 MarkSweep::adjust_pointers(obj);
220 }
221 } else if (!r->is_pinned()) {
222 // This really ought to be "as_CompactibleSpace"...
223 r->adjust_pointers();
224 }
225 return false;
226 }
227 };
228
229 class G1AlwaysTrueClosure: public BoolObjectClosure {
230 public:
231 bool do_object_b(oop p) { return true; }
232 };
233 static G1AlwaysTrueClosure always_true;
234
235 void G1MarkSweep::mark_sweep_phase3() {
236 G1CollectedHeap* g1h = G1CollectedHeap::heap();
237
238 // Adjust the pointers to reflect the new locations
239 GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer());
240
241 // Need cleared claim bits for the roots processing
242 ClassLoaderDataGraph::clear_claimed_marks();
243
244 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
245 {
246 G1RootProcessor root_processor(g1h, 1);
247 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
248 &GenMarkSweep::adjust_cld_closure,
249 &adjust_code_closure);
250 }
251
252 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
253 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
254
255 // Now adjust pointers in remaining weak roots. (All of which should
256 // have been cleared if they pointed to non-surviving objects.)
257 JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure);
258
259 if (G1StringDedup::is_enabled()) {
280 assert(hr->is_empty(), "Should have been cleared in phase 2.");
281 }
282 hr->reset_during_compaction();
283 }
284 } else if (!hr->is_pinned()) {
285 hr->compact();
286 }
287 return false;
288 }
289 };
290
291 void G1MarkSweep::mark_sweep_phase4() {
292 // All pointers are now adjusted, move objects accordingly
293
294 // The ValidateMarkSweep live oops tracking expects us to traverse spaces
295 // in the same order in phase2, phase3 and phase4. We don't quite do that
296 // here (code and comment not fixed for perm removal), so we tell the validate code
297 // to use a higher index (saved from phase2) when verifying perm_gen.
298 G1CollectedHeap* g1h = G1CollectedHeap::heap();
299
300 GCTraceTime tm("phase 4", G1Log::fine() && Verbose, true, gc_timer());
301
302 G1SpaceCompactClosure blk;
303 g1h->heap_region_iterate(&blk);
304
305 }
306
307 void G1MarkSweep::enable_archive_object_check() {
308 assert(!_archive_check_enabled, "archive range check already enabled");
309 _archive_check_enabled = true;
310 size_t length = Universe::heap()->max_capacity();
311 _archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
312 (HeapWord*)Universe::heap()->base() + length,
313 HeapRegion::GrainBytes);
314 }
315
316 void G1MarkSweep::set_range_archive(MemRegion range, bool is_archive) {
317 assert(_archive_check_enabled, "archive range check not enabled");
318 _archive_region_map.set_by_address(range, is_archive);
319 }
320
|
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
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 "classfile/javaClasses.hpp"
27 #include "classfile/symbolTable.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/codeCache.hpp"
31 #include "code/icBuffer.hpp"
32 #include "gc/g1/g1MarkSweep.hpp"
33 #include "gc/g1/g1RootProcessor.hpp"
34 #include "gc/g1/g1StringDedup.hpp"
35 #include "gc/serial/markSweep.inline.hpp"
36 #include "gc/shared/gcHeapSummary.hpp"
37 #include "gc/shared/gcLocker.hpp"
38 #include "gc/shared/gcTimer.hpp"
39 #include "gc/shared/gcTrace.hpp"
40 #include "gc/shared/gcTraceTime.hpp"
41 #include "gc/shared/genCollectedHeap.hpp"
42 #include "gc/shared/modRefBarrierSet.hpp"
43 #include "gc/shared/referencePolicy.hpp"
44 #include "gc/shared/space.hpp"
45 #include "oops/instanceRefKlass.hpp"
46 #include "oops/oop.inline.hpp"
47 #include "prims/jvmtiExport.hpp"
48 #include "runtime/atomic.inline.hpp"
49 #include "runtime/biasedLocking.hpp"
50 #include "runtime/fprofiler.hpp"
51 #include "runtime/synchronizer.hpp"
105 BiasedLocking::restore_marks();
106 GenMarkSweep::deallocate_stacks();
107
108 CodeCache::gc_epilogue();
109 JvmtiExport::gc_epilogue();
110
111 // refs processing: clean slate
112 GenMarkSweep::set_ref_processor(NULL);
113 }
114
115
116 void G1MarkSweep::allocate_stacks() {
117 GenMarkSweep::_preserved_count_max = 0;
118 GenMarkSweep::_preserved_marks = NULL;
119 GenMarkSweep::_preserved_count = 0;
120 }
121
122 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
123 bool clear_all_softrefs) {
124 // Recursively traverse all live objects and mark them
125 GCTraceTime(Trace, gc) tm("phase 1: Mark live objects", gc_timer());
126
127 G1CollectedHeap* g1h = G1CollectedHeap::heap();
128
129 // Need cleared claim bits for the roots processing
130 ClassLoaderDataGraph::clear_claimed_marks();
131
132 MarkingCodeBlobClosure follow_code_closure(&GenMarkSweep::follow_root_closure, !CodeBlobToOopClosure::FixRelocations);
133 {
134 G1RootProcessor root_processor(g1h, 1);
135 root_processor.process_strong_roots(&GenMarkSweep::follow_root_closure,
136 &GenMarkSweep::follow_cld_closure,
137 &follow_code_closure);
138 }
139
140 // Process reference objects found during marking
141 ReferenceProcessor* rp = GenMarkSweep::ref_processor();
142 assert(rp == g1h->ref_processor_stw(), "Sanity");
143
144 rp->setup_policy(clear_all_softrefs);
145 const ReferenceProcessorStats& stats =
165
166 // Delete entries for dead interned string and clean up unreferenced symbols in symbol table.
167 g1h->unlink_string_and_symbol_table(&GenMarkSweep::is_alive);
168
169 if (VerifyDuringGC) {
170 HandleMark hm; // handle scope
171 #if defined(COMPILER2) || INCLUDE_JVMCI
172 DerivedPointerTableDeactivate dpt_deact;
173 #endif
174 g1h->prepare_for_verify();
175 // Note: we can verify only the heap here. When an object is
176 // marked, the previous value of the mark word (including
177 // identity hash values, ages, etc) is preserved, and the mark
178 // word is set to markOop::marked_value - effectively removing
179 // any hash values from the mark word. These hash values are
180 // used when verifying the dictionaries and so removing them
181 // from the mark word can make verification of the dictionaries
182 // fail. At the end of the GC, the original mark word values
183 // (including hash values) are restored to the appropriate
184 // objects.
185 GCTraceTime(Info, gc, verify)("During GC (full)");
186 g1h->verify(VerifyOption_G1UseMarkWord);
187 }
188
189 gc_tracer()->report_object_count_after_gc(&GenMarkSweep::is_alive);
190 }
191
192
193 void G1MarkSweep::mark_sweep_phase2() {
194 // Now all live objects are marked, compute the new object addresses.
195
196 // It is not required that we traverse spaces in the same order in
197 // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
198 // tracking expects us to do so. See comment under phase4.
199
200 GCTraceTime(Trace, gc) tm("phase 2: Compute new object addresses", gc_timer());
201
202 prepare_compaction();
203 }
204
205 class G1AdjustPointersClosure: public HeapRegionClosure {
206 public:
207 bool doHeapRegion(HeapRegion* r) {
208 if (r->is_humongous()) {
209 if (r->is_starts_humongous()) {
210 // We must adjust the pointers on the single H object.
211 oop obj = oop(r->bottom());
212 // point all the oops to the new location
213 MarkSweep::adjust_pointers(obj);
214 }
215 } else if (!r->is_pinned()) {
216 // This really ought to be "as_CompactibleSpace"...
217 r->adjust_pointers();
218 }
219 return false;
220 }
221 };
222
223 class G1AlwaysTrueClosure: public BoolObjectClosure {
224 public:
225 bool do_object_b(oop p) { return true; }
226 };
227 static G1AlwaysTrueClosure always_true;
228
229 void G1MarkSweep::mark_sweep_phase3() {
230 G1CollectedHeap* g1h = G1CollectedHeap::heap();
231
232 // Adjust the pointers to reflect the new locations
233 GCTraceTime(Trace, gc) tm("phase 3: Adjust pointers", gc_timer());
234
235 // Need cleared claim bits for the roots processing
236 ClassLoaderDataGraph::clear_claimed_marks();
237
238 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
239 {
240 G1RootProcessor root_processor(g1h, 1);
241 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
242 &GenMarkSweep::adjust_cld_closure,
243 &adjust_code_closure);
244 }
245
246 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
247 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
248
249 // Now adjust pointers in remaining weak roots. (All of which should
250 // have been cleared if they pointed to non-surviving objects.)
251 JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure);
252
253 if (G1StringDedup::is_enabled()) {
274 assert(hr->is_empty(), "Should have been cleared in phase 2.");
275 }
276 hr->reset_during_compaction();
277 }
278 } else if (!hr->is_pinned()) {
279 hr->compact();
280 }
281 return false;
282 }
283 };
284
285 void G1MarkSweep::mark_sweep_phase4() {
286 // All pointers are now adjusted, move objects accordingly
287
288 // The ValidateMarkSweep live oops tracking expects us to traverse spaces
289 // in the same order in phase2, phase3 and phase4. We don't quite do that
290 // here (code and comment not fixed for perm removal), so we tell the validate code
291 // to use a higher index (saved from phase2) when verifying perm_gen.
292 G1CollectedHeap* g1h = G1CollectedHeap::heap();
293
294 GCTraceTime(Trace, gc) tm("phase 4: Move objects", gc_timer());
295
296 G1SpaceCompactClosure blk;
297 g1h->heap_region_iterate(&blk);
298
299 }
300
301 void G1MarkSweep::enable_archive_object_check() {
302 assert(!_archive_check_enabled, "archive range check already enabled");
303 _archive_check_enabled = true;
304 size_t length = Universe::heap()->max_capacity();
305 _archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
306 (HeapWord*)Universe::heap()->base() + length,
307 HeapRegion::GrainBytes);
308 }
309
310 void G1MarkSweep::set_range_archive(MemRegion range, bool is_archive) {
311 assert(_archive_check_enabled, "archive range check not enabled");
312 _archive_region_map.set_by_address(range, is_archive);
313 }
314
|