Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/g1/g1MarkSweep.cpp @ 3979:4dfb2df418f2
6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author | johnc |
---|---|
date | Thu, 22 Sep 2011 10:57:37 -0700 |
parents | 6747fd0512e0 |
children | 8aae2050e83e |
comparison
equal
deleted
inserted
replaced
3978:f0ecbe78fc7b | 3979:4dfb2df418f2 |
---|---|
60 } | 60 } |
61 #endif | 61 #endif |
62 // hook up weak ref data so it can be used during Mark-Sweep | 62 // hook up weak ref data so it can be used during Mark-Sweep |
63 assert(GenMarkSweep::ref_processor() == NULL, "no stomping"); | 63 assert(GenMarkSweep::ref_processor() == NULL, "no stomping"); |
64 assert(rp != NULL, "should be non-NULL"); | 64 assert(rp != NULL, "should be non-NULL"); |
65 assert(rp == G1CollectedHeap::heap()->ref_processor_stw(), "Precondition"); | |
66 | |
65 GenMarkSweep::_ref_processor = rp; | 67 GenMarkSweep::_ref_processor = rp; |
66 rp->setup_policy(clear_all_softrefs); | 68 rp->setup_policy(clear_all_softrefs); |
67 | 69 |
68 // When collecting the permanent generation methodOops may be moving, | 70 // When collecting the permanent generation methodOops may be moving, |
69 // so we either have to flush all bcp data or convert it into bci. | 71 // so we either have to flush all bcp data or convert it into bci. |
137 &GenMarkSweep::follow_code_root_closure, | 139 &GenMarkSweep::follow_code_root_closure, |
138 &GenMarkSweep::follow_root_closure); | 140 &GenMarkSweep::follow_root_closure); |
139 | 141 |
140 // Process reference objects found during marking | 142 // Process reference objects found during marking |
141 ReferenceProcessor* rp = GenMarkSweep::ref_processor(); | 143 ReferenceProcessor* rp = GenMarkSweep::ref_processor(); |
144 assert(rp == G1CollectedHeap::heap()->ref_processor_stw(), "Sanity"); | |
145 | |
142 rp->setup_policy(clear_all_softrefs); | 146 rp->setup_policy(clear_all_softrefs); |
143 rp->process_discovered_references(&GenMarkSweep::is_alive, | 147 rp->process_discovered_references(&GenMarkSweep::is_alive, |
144 &GenMarkSweep::keep_alive, | 148 &GenMarkSweep::keep_alive, |
145 &GenMarkSweep::follow_stack_closure, | 149 &GenMarkSweep::follow_stack_closure, |
146 NULL); | 150 NULL); |
163 "stack should be empty by now"); | 167 "stack should be empty by now"); |
164 | 168 |
165 // Visit memoized MDO's and clear any unmarked weak refs | 169 // Visit memoized MDO's and clear any unmarked weak refs |
166 GenMarkSweep::follow_mdo_weak_refs(); | 170 GenMarkSweep::follow_mdo_weak_refs(); |
167 assert(GenMarkSweep::_marking_stack.is_empty(), "just drained"); | 171 assert(GenMarkSweep::_marking_stack.is_empty(), "just drained"); |
168 | |
169 | 172 |
170 // Visit interned string tables and delete unmarked oops | 173 // Visit interned string tables and delete unmarked oops |
171 StringTable::unlink(&GenMarkSweep::is_alive); | 174 StringTable::unlink(&GenMarkSweep::is_alive); |
172 // Clean up unreferenced symbols in symbol table. | 175 // Clean up unreferenced symbols in symbol table. |
173 SymbolTable::unlink(); | 176 SymbolTable::unlink(); |
344 SharedHeap::SO_AllClasses, | 347 SharedHeap::SO_AllClasses, |
345 &GenMarkSweep::adjust_root_pointer_closure, | 348 &GenMarkSweep::adjust_root_pointer_closure, |
346 NULL, // do not touch code cache here | 349 NULL, // do not touch code cache here |
347 &GenMarkSweep::adjust_pointer_closure); | 350 &GenMarkSweep::adjust_pointer_closure); |
348 | 351 |
349 g1h->ref_processor()->weak_oops_do(&GenMarkSweep::adjust_root_pointer_closure); | 352 assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity"); |
353 g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_root_pointer_closure); | |
350 | 354 |
351 // Now adjust pointers in remaining weak roots. (All of which should | 355 // Now adjust pointers in remaining weak roots. (All of which should |
352 // have been cleared if they pointed to non-surviving objects.) | 356 // have been cleared if they pointed to non-surviving objects.) |
353 g1h->g1_process_weak_roots(&GenMarkSweep::adjust_root_pointer_closure, | 357 g1h->g1_process_weak_roots(&GenMarkSweep::adjust_root_pointer_closure, |
354 &GenMarkSweep::adjust_pointer_closure); | 358 &GenMarkSweep::adjust_pointer_closure); |