# HG changeset patch # User kamg # Date 1241711093 14400 # Node ID c8f1f4de26c9d68d7d4af1f3b50341bcd6c76003 # Parent 81a249214991350ffd785b09cbac0b85a945a070# Parent 51285b431bb268bf02d0461e6b27c4b7f992c3c7 Merge diff -r 81a249214991 -r c8f1f4de26c9 src/share/vm/gc_implementation/g1/g1RemSet.cpp --- a/src/share/vm/gc_implementation/g1/g1RemSet.cpp Mon May 04 17:58:10 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu May 07 11:44:53 2009 -0400 @@ -180,6 +180,7 @@ CardTableModRefBS *_ct_bs; int _worker_i; bool _try_claimed; + size_t _min_skip_distance, _max_skip_distance; public: ScanRSClosure(OopsInHeapRegionClosure* oc, int worker_i) : _oc(oc), @@ -191,6 +192,8 @@ _g1h = G1CollectedHeap::heap(); _bot_shared = _g1h->bot_shared(); _ct_bs = (CardTableModRefBS*) (_g1h->barrier_set()); + _min_skip_distance = 16; + _max_skip_distance = 2 * _g1h->n_par_threads() * _min_skip_distance; } void set_try_claimed() { _try_claimed = true; } @@ -245,9 +248,13 @@ HeapRegionRemSetIterator* iter = _g1h->rem_set_iterator(_worker_i); hrrs->init_iterator(iter); size_t card_index; + size_t skip_distance = 0, current_card = 0, jump_to_card = 0; while (iter->has_next(card_index)) { + if (current_card < jump_to_card) { + ++current_card; + continue; + } HeapWord* card_start = _g1h->bot_shared()->address_for_index(card_index); - #if 0 gclog_or_tty->print("Rem set iteration yielded card [" PTR_FORMAT ", " PTR_FORMAT ").\n", card_start, card_start + CardTableModRefBS::card_size_in_words); @@ -257,20 +264,28 @@ assert(card_region != NULL, "Yielding cards not in the heap?"); _cards++; - if (!card_region->in_collection_set()) { - // If the card is dirty, then we will scan it during updateRS. - if (!_ct_bs->is_card_claimed(card_index) && - !_ct_bs->is_card_dirty(card_index)) { - assert(_ct_bs->is_card_clean(card_index) || - _ct_bs->is_card_claimed(card_index) || - _ct_bs->is_card_deferred(card_index), - "Card is either clean, claimed or deferred"); - if (_ct_bs->claim_card(card_index)) + // If the card is dirty, then we will scan it during updateRS. + if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) { + if (!_ct_bs->is_card_claimed(card_index) && _ct_bs->claim_card(card_index)) { scanCard(card_index, card_region); - } + } else if (_try_claimed) { + if (jump_to_card == 0 || jump_to_card != current_card) { + // We did some useful work in the previous iteration. + // Decrease the distance. + skip_distance = MAX2(skip_distance >> 1, _min_skip_distance); + } else { + // Previous iteration resulted in a claim failure. + // Increase the distance. + skip_distance = MIN2(skip_distance << 1, _max_skip_distance); + } + jump_to_card = current_card + skip_distance; + } } + ++current_card; } - hrrs->set_iter_complete(); + if (!_try_claimed) { + hrrs->set_iter_complete(); + } return false; } // Set all cards back to clean. diff -r 81a249214991 -r c8f1f4de26c9 src/share/vm/gc_implementation/g1/g1_globals.hpp --- a/src/share/vm/gc_implementation/g1/g1_globals.hpp Mon May 04 17:58:10 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/g1_globals.hpp Thu May 07 11:44:53 2009 -0400 @@ -71,7 +71,7 @@ develop(intx, G1MarkingVerboseLevel, 0, \ "Level (0-4) of verboseness of the marking code") \ \ - develop(bool, G1VerifyConcMarkPrintReachable, true, \ + develop(bool, G1VerifyConcMarkPrintReachable, false, \ "If conc mark verification fails, print reachable objects") \ \ develop(bool, G1TraceMarkStackOverflow, false, \ diff -r 81a249214991 -r c8f1f4de26c9 src/share/vm/gc_implementation/g1/heapRegion.cpp --- a/src/share/vm/gc_implementation/g1/heapRegion.cpp Mon May 04 17:58:10 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu May 07 11:44:53 2009 -0400 @@ -718,7 +718,7 @@ vl_cl.failures()) { g1->concurrent_mark()->print_prev_bitmap_reachable(); } - guarantee(!vl_cl.failures(), "should not have had any failures"); + guarantee(!vl_cl.failures(), "region verification failed"); guarantee(p == top(), "end of last object must match end of space"); }