1.1 --- a/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Thu Oct 10 13:25:51 2013 -0700 1.2 +++ b/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Fri Oct 11 08:27:21 2013 -0700 1.3 @@ -70,6 +70,12 @@ 1.4 if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) { 1.5 return false; 1.6 } 1.7 + 1.8 + if (val == g1_young_gen) { 1.9 + // the card is for a young gen region. We don't need to keep track of all pointers into young 1.10 + return false; 1.11 + } 1.12 + 1.13 // Cached bit can be installed either on a clean card or on a claimed card. 1.14 jbyte new_val = val; 1.15 if (val == clean_card_val()) { 1.16 @@ -85,6 +91,19 @@ 1.17 return true; 1.18 } 1.19 1.20 +void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) { 1.21 + jbyte *const first = byte_for(mr.start()); 1.22 + jbyte *const last = byte_after(mr.last()); 1.23 + 1.24 + memset(first, g1_young_gen, last - first); 1.25 +} 1.26 + 1.27 +#ifndef PRODUCT 1.28 +void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) { 1.29 + verify_region(mr, g1_young_gen, true); 1.30 +} 1.31 +#endif 1.32 + 1.33 G1SATBCardTableLoggingModRefBS:: 1.34 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, 1.35 int max_covered_regions) : 1.36 @@ -97,7 +116,11 @@ 1.37 void 1.38 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field, 1.39 oop new_val) { 1.40 - jbyte* byte = byte_for(field); 1.41 + volatile jbyte* byte = byte_for(field); 1.42 + if (*byte == g1_young_gen) { 1.43 + return; 1.44 + } 1.45 + OrderAccess::storeload(); 1.46 if (*byte != dirty_card) { 1.47 *byte = dirty_card; 1.48 Thread* thr = Thread::current(); 1.49 @@ -129,7 +152,7 @@ 1.50 1.51 void 1.52 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { 1.53 - jbyte* byte = byte_for(mr.start()); 1.54 + volatile jbyte* byte = byte_for(mr.start()); 1.55 jbyte* last_byte = byte_for(mr.last()); 1.56 Thread* thr = Thread::current(); 1.57 if (whole_heap) { 1.58 @@ -138,25 +161,35 @@ 1.59 byte++; 1.60 } 1.61 } else { 1.62 - // Enqueue if necessary. 1.63 - if (thr->is_Java_thread()) { 1.64 - JavaThread* jt = (JavaThread*)thr; 1.65 - while (byte <= last_byte) { 1.66 - if (*byte != dirty_card) { 1.67 - *byte = dirty_card; 1.68 - jt->dirty_card_queue().enqueue(byte); 1.69 + // skip all consecutive young cards 1.70 + for (; byte <= last_byte && *byte == g1_young_gen; byte++); 1.71 + 1.72 + if (byte <= last_byte) { 1.73 + OrderAccess::storeload(); 1.74 + // Enqueue if necessary. 1.75 + if (thr->is_Java_thread()) { 1.76 + JavaThread* jt = (JavaThread*)thr; 1.77 + for (; byte <= last_byte; byte++) { 1.78 + if (*byte == g1_young_gen) { 1.79 + continue; 1.80 + } 1.81 + if (*byte != dirty_card) { 1.82 + *byte = dirty_card; 1.83 + jt->dirty_card_queue().enqueue(byte); 1.84 + } 1.85 } 1.86 - byte++; 1.87 - } 1.88 - } else { 1.89 - MutexLockerEx x(Shared_DirtyCardQ_lock, 1.90 - Mutex::_no_safepoint_check_flag); 1.91 - while (byte <= last_byte) { 1.92 - if (*byte != dirty_card) { 1.93 - *byte = dirty_card; 1.94 - _dcqs.shared_dirty_card_queue()->enqueue(byte); 1.95 + } else { 1.96 + MutexLockerEx x(Shared_DirtyCardQ_lock, 1.97 + Mutex::_no_safepoint_check_flag); 1.98 + for (; byte <= last_byte; byte++) { 1.99 + if (*byte == g1_young_gen) { 1.100 + continue; 1.101 + } 1.102 + if (*byte != dirty_card) { 1.103 + *byte = dirty_card; 1.104 + _dcqs.shared_dirty_card_queue()->enqueue(byte); 1.105 + } 1.106 } 1.107 - byte++; 1.108 } 1.109 } 1.110 }