35 #include "gc_implementation/g1/g1StringDedup.hpp"
36 #include "gc_implementation/shared/gcHeapSummary.hpp"
37 #include "gc_implementation/shared/gcTimer.hpp"
38 #include "gc_implementation/shared/gcTrace.hpp"
39 #include "gc_implementation/shared/gcTraceTime.hpp"
40 #include "memory/gcLocker.hpp"
41 #include "memory/genCollectedHeap.hpp"
42 #include "memory/modRefBarrierSet.hpp"
43 #include "memory/referencePolicy.hpp"
44 #include "memory/space.hpp"
45 #include "oops/instanceRefKlass.hpp"
46 #include "oops/oop.inline.hpp"
47 #include "prims/jvmtiExport.hpp"
48 #include "runtime/biasedLocking.hpp"
49 #include "runtime/fprofiler.hpp"
50 #include "runtime/synchronizer.hpp"
51 #include "runtime/thread.hpp"
52 #include "runtime/vmThread.hpp"
53 #include "utilities/copy.hpp"
54 #include "utilities/events.hpp"
55
56 class HeapRegion;
57
58 void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
59 bool clear_all_softrefs) {
60 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
61
62 SharedHeap* sh = SharedHeap::heap();
63 #ifdef ASSERT
64 if (sh->collector_policy()->should_clear_all_soft_refs()) {
65 assert(clear_all_softrefs, "Policy should have been checked earler");
66 }
67 #endif
68 // hook up weak ref data so it can be used during Mark-Sweep
69 assert(GenMarkSweep::ref_processor() == NULL, "no stomping");
70 assert(rp != NULL, "should be non-NULL");
71 assert(rp == G1CollectedHeap::heap()->ref_processor_stw(), "Precondition");
72
73 GenMarkSweep::_ref_processor = rp;
74 rp->setup_policy(clear_all_softrefs);
250 GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
251 GenMarkSweep::trace("3");
252
253 // Need cleared claim bits for the roots processing
254 ClassLoaderDataGraph::clear_claimed_marks();
255
256 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
257 {
258 G1RootProcessor root_processor(g1h);
259 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
260 &GenMarkSweep::adjust_cld_closure,
261 &adjust_code_closure);
262 }
263
264 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
265 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
266
267 // Now adjust pointers in remaining weak roots. (All of which should
268 // have been cleared if they pointed to non-surviving objects.)
269 JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure);
270
271 if (G1StringDedup::is_enabled()) {
272 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
273 }
274
275 GenMarkSweep::adjust_marks();
276
277 G1AdjustPointersClosure blk;
278 g1h->heap_region_iterate(&blk);
279 }
280
281 class G1SpaceCompactClosure: public HeapRegionClosure {
282 public:
283 G1SpaceCompactClosure() {}
284
285 bool doHeapRegion(HeapRegion* hr) {
286 if (hr->isHumongous()) {
287 if (hr->startsHumongous()) {
288 oop obj = oop(hr->bottom());
289 if (obj->is_gc_marked()) {
|
35 #include "gc_implementation/g1/g1StringDedup.hpp"
36 #include "gc_implementation/shared/gcHeapSummary.hpp"
37 #include "gc_implementation/shared/gcTimer.hpp"
38 #include "gc_implementation/shared/gcTrace.hpp"
39 #include "gc_implementation/shared/gcTraceTime.hpp"
40 #include "memory/gcLocker.hpp"
41 #include "memory/genCollectedHeap.hpp"
42 #include "memory/modRefBarrierSet.hpp"
43 #include "memory/referencePolicy.hpp"
44 #include "memory/space.hpp"
45 #include "oops/instanceRefKlass.hpp"
46 #include "oops/oop.inline.hpp"
47 #include "prims/jvmtiExport.hpp"
48 #include "runtime/biasedLocking.hpp"
49 #include "runtime/fprofiler.hpp"
50 #include "runtime/synchronizer.hpp"
51 #include "runtime/thread.hpp"
52 #include "runtime/vmThread.hpp"
53 #include "utilities/copy.hpp"
54 #include "utilities/events.hpp"
55 #if INCLUDE_JFR
56 #include "jfr/jfr.hpp"
57 #endif // INCLUDE_JFR
58
59 class HeapRegion;
60
61 void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
62 bool clear_all_softrefs) {
63 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
64
65 SharedHeap* sh = SharedHeap::heap();
66 #ifdef ASSERT
67 if (sh->collector_policy()->should_clear_all_soft_refs()) {
68 assert(clear_all_softrefs, "Policy should have been checked earler");
69 }
70 #endif
71 // hook up weak ref data so it can be used during Mark-Sweep
72 assert(GenMarkSweep::ref_processor() == NULL, "no stomping");
73 assert(rp != NULL, "should be non-NULL");
74 assert(rp == G1CollectedHeap::heap()->ref_processor_stw(), "Precondition");
75
76 GenMarkSweep::_ref_processor = rp;
77 rp->setup_policy(clear_all_softrefs);
253 GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
254 GenMarkSweep::trace("3");
255
256 // Need cleared claim bits for the roots processing
257 ClassLoaderDataGraph::clear_claimed_marks();
258
259 CodeBlobToOopClosure adjust_code_closure(&GenMarkSweep::adjust_pointer_closure, CodeBlobToOopClosure::FixRelocations);
260 {
261 G1RootProcessor root_processor(g1h);
262 root_processor.process_all_roots(&GenMarkSweep::adjust_pointer_closure,
263 &GenMarkSweep::adjust_cld_closure,
264 &adjust_code_closure);
265 }
266
267 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity");
268 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_pointer_closure);
269
270 // Now adjust pointers in remaining weak roots. (All of which should
271 // have been cleared if they pointed to non-surviving objects.)
272 JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure);
273 JFR_ONLY(Jfr::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure));
274
275 if (G1StringDedup::is_enabled()) {
276 G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure);
277 }
278
279 GenMarkSweep::adjust_marks();
280
281 G1AdjustPointersClosure blk;
282 g1h->heap_region_iterate(&blk);
283 }
284
285 class G1SpaceCompactClosure: public HeapRegionClosure {
286 public:
287 G1SpaceCompactClosure() {}
288
289 bool doHeapRegion(HeapRegion* hr) {
290 if (hr->isHumongous()) {
291 if (hr->startsHumongous()) {
292 oop obj = oop(hr->bottom());
293 if (obj->is_gc_marked()) {
|