--- old/src/share/vm/gc_implementation/g1/g1CardCounts.cpp 2013-05-14 14:04:39.125371513 -0700 +++ new/src/share/vm/gc_implementation/g1/g1CardCounts.cpp 2013-05-14 14:04:38.918906257 -0700 @@ -101,20 +101,23 @@ ReservedSpace::allocation_align_size_up(_committed_size), err_msg("Unaligned? committed_size: " SIZE_FORMAT, _committed_size)); - // Verify that the committed space for the card counts - // matches our committed max card num. + // Verify that the committed space for the card counts matches our + // committed max card num. Note for some allocation alignments, the + // amount of space actually committed for the counts table will be able + // to span more cards than the number spanned by the maximum heap. size_t prev_committed_size = _committed_size; - size_t prev_committed_card_num = prev_committed_size / sizeof(jbyte); + size_t prev_committed_card_num = committed_to_card_num(prev_committed_size); + assert(prev_committed_card_num == _committed_max_card_num, err_msg("Card mismatch: " "prev: " SIZE_FORMAT ", " - "committed: "SIZE_FORMAT, - prev_committed_card_num, _committed_max_card_num)); + "committed: "SIZE_FORMAT", " + "reserved: "SIZE_FORMAT, + prev_committed_card_num, _committed_max_card_num, _reserved_max_card_num)); size_t new_size = (heap_capacity >> CardTableModRefBS::card_shift) * sizeof(jbyte); size_t new_committed_size = ReservedSpace::allocation_align_size_up(new_size); - size_t new_committed_card_num = - MIN2(_reserved_max_card_num, new_committed_size / sizeof(jbyte)); + size_t new_committed_card_num = committed_to_card_num(new_committed_size); if (_committed_max_card_num < new_committed_card_num) { // we need to expand the backing store for the card counts --- old/src/share/vm/gc_implementation/g1/g1CardCounts.hpp 2013-05-14 14:04:40.265808491 -0700 +++ new/src/share/vm/gc_implementation/g1/g1CardCounts.hpp 2013-05-14 14:04:40.061799773 -0700 @@ -94,6 +94,14 @@ return (jbyte*) (_ct_bot + card_num); } + // Helper routine. + // Returns the number of cards that can be counted by the given committed + // table size, with a maximum of the number of cards spanned by the max + // capacity of the heap. + size_t committed_to_card_num(size_t committed_size) { + return MIN2(_reserved_max_card_num, committed_size / sizeof(jbyte)); + } + // Clear the counts table for the given (exclusive) index range. void clear_range(size_t from_card_num, size_t to_card_num);