--- old/src/share/vm/gc_implementation/g1/g1ParScanThreadState.inline.hpp 2014-07-21 15:24:56.428158486 +0200 +++ new/src/share/vm/gc_implementation/g1/g1ParScanThreadState.inline.hpp 2014-07-21 15:24:56.342155974 +0200 @@ -52,16 +52,20 @@ // set, due to (benign) races in the claim mechanism during RSet scanning more // than one thread might claim the same card. So the same card may be // processed multiple times. So redo this check. - if (_g1h->is_in_cset_or_humongous(obj)) { + G1FastCSetBiasedMappedArray::in_cset_state_t in_cset_state = _g1h->in_cset_state(obj); + if (in_cset_state == G1FastCSetBiasedMappedArray::InCSet) { oop forwardee; if (obj->is_forwarded()) { forwardee = obj->forwardee(); } else { forwardee = copy_to_survivor_space(obj); } - if (forwardee != NULL) { - oopDesc::encode_store_heap_oop(p, forwardee); - } + oopDesc::encode_store_heap_oop(p, forwardee); + } else if (in_cset_state == G1FastCSetBiasedMappedArray::IsHumongous) { + _g1h->set_humongous_is_live(obj); + } else { + assert(in_cset_state == G1FastCSetBiasedMappedArray::InNeither, + err_msg("In_cset_state must be InNeither here, but is %d", in_cset_state)); } assert(obj != NULL, "Must be");