src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

Print this page




4253   }
4254 }
4255 
4256 template <G1Barrier barrier, G1Mark do_mark_object>
4257 template <class T>
4258 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
4259   T heap_oop = oopDesc::load_heap_oop(p);
4260 
4261   if (oopDesc::is_null(heap_oop)) {
4262     return;
4263   }
4264 
4265   oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
4266 
4267   assert(_worker_id == _par_scan_state->queue_num(), "sanity");
4268 
4269   G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj);
4270 
4271   if (state == G1CollectedHeap::InCSet) {
4272     oop forwardee;
4273     if (obj->is_forwarded()) {
4274       forwardee = obj->forwardee();

4275     } else {
4276       forwardee = _par_scan_state->copy_to_survivor_space(obj);
4277     }
4278     assert(forwardee != NULL, "forwardee should not be NULL");
4279     oopDesc::encode_store_heap_oop(p, forwardee);
4280     if (do_mark_object != G1MarkNone && forwardee != obj) {
4281       // If the object is self-forwarded we don't need to explicitly
4282       // mark it, the evacuation failure protocol will do so.
4283       mark_forwarded_object(obj, forwardee);
4284     }
4285 
4286     if (barrier == G1BarrierKlass) {
4287       do_klass_barrier(p, forwardee);
4288     }
4289   } else {
4290     if (state == G1CollectedHeap::IsHumongous) {
4291       _g1->set_humongous_is_live(obj);
4292     }
4293     // The object is not in collection set. If we're a root scanning
4294     // closure during an initial mark pause then attempt to mark the object.
4295     if (do_mark_object == G1MarkFromRoot) {
4296       mark_object(obj);




4253   }
4254 }
4255 
4256 template <G1Barrier barrier, G1Mark do_mark_object>
4257 template <class T>
4258 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
4259   T heap_oop = oopDesc::load_heap_oop(p);
4260 
4261   if (oopDesc::is_null(heap_oop)) {
4262     return;
4263   }
4264 
4265   oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
4266 
4267   assert(_worker_id == _par_scan_state->queue_num(), "sanity");
4268 
4269   G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj);
4270 
4271   if (state == G1CollectedHeap::InCSet) {
4272     oop forwardee;
4273     markOop m = obj->mark();
4274     if (m->is_marked()) {
4275       forwardee = (oop) m->decode_pointer();
4276     } else {
4277       forwardee = _par_scan_state->copy_to_survivor_space(obj, m);
4278     }
4279     assert(forwardee != NULL, "forwardee should not be NULL");
4280     oopDesc::encode_store_heap_oop(p, forwardee);
4281     if (do_mark_object != G1MarkNone && forwardee != obj) {
4282       // If the object is self-forwarded we don't need to explicitly
4283       // mark it, the evacuation failure protocol will do so.
4284       mark_forwarded_object(obj, forwardee);
4285     }
4286 
4287     if (barrier == G1BarrierKlass) {
4288       do_klass_barrier(p, forwardee);
4289     }
4290   } else {
4291     if (state == G1CollectedHeap::IsHumongous) {
4292       _g1->set_humongous_is_live(obj);
4293     }
4294     // The object is not in collection set. If we're a root scanning
4295     // closure during an initial mark pause then attempt to mark the object.
4296     if (do_mark_object == G1MarkFromRoot) {
4297       mark_object(obj);