31 #include "code/icBuffer.hpp"
32 #include "gc/g1/g1FullGCScope.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.inline.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.hpp"
50 #include "runtime/biasedLocking.hpp"
51 #include "runtime/synchronizer.hpp"
52 #include "runtime/thread.hpp"
53 #include "runtime/vmThread.hpp"
54 #include "utilities/copy.hpp"
55 #include "utilities/events.hpp"
56
57 class HeapRegion;
58
59 void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
60 bool clear_all_softrefs) {
61 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
62 HandleMark hm; // Discard invalid handles created during gc
63
64 #if defined(COMPILER2) || INCLUDE_JVMCI
65 DerivedPointerTable::clear();
66 #endif
67 #ifdef ASSERT
68 if (G1CollectedHeap::heap()->collector_policy()->should_clear_all_soft_refs()) {
69 assert(clear_all_softrefs, "Policy should have been checked earler");
70 }
256 // Adjust the pointers to reflect the new locations
257 GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", gc_timer());
258
259 // Need cleared claim bits for the roots processing
260 ClassLoaderDataGraph::clear_claimed_marks();
261
262 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
263 {
264 G1RootProcessor root_processor(g1h, 1);
265 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
266 &GenMarkSweep::adjust_cld_closure,
267 &adjust_code_closure);
268 }
269
270 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
271 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
272
273 // Now adjust pointers in remaining weak roots. (All of which should
274 // have been cleared if they pointed to non-surviving objects.)
275 JNIHandles::weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
276
277 if (G1StringDedup::is_enabled()) {
278 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
279 }
280
281 GenMarkSweep::adjust_marks();
282
283 G1AdjustPointersClosure blk;
284 g1h->heap_region_iterate(&blk);
285 }
286
287 class G1SpaceCompactClosure: public HeapRegionClosure {
288 public:
289 G1SpaceCompactClosure() {}
290
291 bool doHeapRegion(HeapRegion* hr) {
292 if (hr->is_humongous()) {
293 if (hr->is_starts_humongous()) {
294 oop obj = oop(hr->bottom());
295 if (obj->is_gc_marked()) {
|
31 #include "code/icBuffer.hpp"
32 #include "gc/g1/g1FullGCScope.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.inline.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.hpp"
50 #include "runtime/biasedLocking.hpp"
51 #include "runtime/heapMonitoring.hpp"
52 #include "runtime/synchronizer.hpp"
53 #include "runtime/thread.hpp"
54 #include "runtime/vmThread.hpp"
55 #include "utilities/copy.hpp"
56 #include "utilities/events.hpp"
57
58 class HeapRegion;
59
60 void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
61 bool clear_all_softrefs) {
62 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
63 HandleMark hm; // Discard invalid handles created during gc
64
65 #if defined(COMPILER2) || INCLUDE_JVMCI
66 DerivedPointerTable::clear();
67 #endif
68 #ifdef ASSERT
69 if (G1CollectedHeap::heap()->collector_policy()->should_clear_all_soft_refs()) {
70 assert(clear_all_softrefs, "Policy should have been checked earler");
71 }
257 // Adjust the pointers to reflect the new locations
258 GCTraceTime(Info, gc, phases) tm("Phase 3: Adjust pointers", gc_timer());
259
260 // Need cleared claim bits for the roots processing
261 ClassLoaderDataGraph::clear_claimed_marks();
262
263 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
264 {
265 G1RootProcessor root_processor(g1h, 1);
266 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
267 &GenMarkSweep::adjust_cld_closure,
268 &adjust_code_closure);
269 }
270
271 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
272 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
273
274 // Now adjust pointers in remaining weak roots. (All of which should
275 // have been cleared if they pointed to non-surviving objects.)
276 JNIHandles::weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
277 HeapMonitoring::weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
278
279 if (G1StringDedup::is_enabled()) {
280 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
281 }
282
283 GenMarkSweep::adjust_marks();
284
285 G1AdjustPointersClosure blk;
286 g1h->heap_region_iterate(&blk);
287 }
288
289 class G1SpaceCompactClosure: public HeapRegionClosure {
290 public:
291 G1SpaceCompactClosure() {}
292
293 bool doHeapRegion(HeapRegion* hr) {
294 if (hr->is_humongous()) {
295 if (hr->is_starts_humongous()) {
296 oop obj = oop(hr->bottom());
297 if (obj->is_gc_marked()) {
|