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);