--- old/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp 2013-09-09 10:14:26.593378452 +0200 +++ new/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp 2013-09-09 10:14:26.497376688 +0200 @@ -36,6 +36,12 @@ _kind = G1SATBCT; } +void G1SATBCardTableModRefBS::g1_dirty_young(const MemRegion& mr) { + jbyte *const first = byte_for(mr.start()); + jbyte *const last = byte_after(mr.last()); + + memset(first, g1_young_gen, last - first); +} void G1SATBCardTableModRefBS::enqueue(oop pre_val) { // Nulls should have been already filtered. @@ -76,7 +82,11 @@ void G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field, oop new_val) { - jbyte* byte = byte_for(field); + volatile jbyte* byte = byte_for(field); + if (*byte == g1_young_gen) { + return; + } + OrderAccess::storeload(); if (*byte != dirty_card) { *byte = dirty_card; Thread* thr = Thread::current(); @@ -108,7 +118,7 @@ void G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { - jbyte* byte = byte_for(mr.start()); + volatile jbyte* byte = byte_for(mr.start()); jbyte* last_byte = byte_for(mr.last()); Thread* thr = Thread::current(); if (whole_heap) { @@ -120,22 +130,28 @@ // Enqueue if necessary. if (thr->is_Java_thread()) { JavaThread* jt = (JavaThread*)thr; - while (byte <= last_byte) { + for (; byte <= last_byte; byte++) { + if (*byte == g1_young_gen) { + continue; + } + OrderAccess::storeload(); if (*byte != dirty_card) { *byte = dirty_card; jt->dirty_card_queue().enqueue(byte); } - byte++; } } else { MutexLockerEx x(Shared_DirtyCardQ_lock, Mutex::_no_safepoint_check_flag); - while (byte <= last_byte) { + for (; byte <= last_byte; byte++) { + if (*byte == g1_young_gen) { + continue; + } + OrderAccess::storeload(); if (*byte != dirty_card) { *byte = dirty_card; _dcqs.shared_dirty_card_queue()->enqueue(byte); } - byte++; } } }