提交 0ea9fca5 编写于 作者: J johnc

8014408: G1: crashes with assert assert(prev_committed_card_num == _committed_max_card_num) failed

Summary: Mismatch in the card number calculation between next and previous committed sizes of the card counts table.
Reviewed-by: jmasa, tschatzl
上级 d8e75982
...@@ -101,20 +101,23 @@ void G1CardCounts::resize(size_t heap_capacity) { ...@@ -101,20 +101,23 @@ void G1CardCounts::resize(size_t heap_capacity) {
ReservedSpace::allocation_align_size_up(_committed_size), ReservedSpace::allocation_align_size_up(_committed_size),
err_msg("Unaligned? committed_size: " SIZE_FORMAT, _committed_size)); err_msg("Unaligned? committed_size: " SIZE_FORMAT, _committed_size));
// Verify that the committed space for the card counts // Verify that the committed space for the card counts matches our
// matches our committed max card num. // 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_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, assert(prev_committed_card_num == _committed_max_card_num,
err_msg("Card mismatch: " err_msg("Card mismatch: "
"prev: " SIZE_FORMAT ", " "prev: " SIZE_FORMAT ", "
"committed: "SIZE_FORMAT, "committed: "SIZE_FORMAT", "
prev_committed_card_num, _committed_max_card_num)); "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_size = (heap_capacity >> CardTableModRefBS::card_shift) * sizeof(jbyte);
size_t new_committed_size = ReservedSpace::allocation_align_size_up(new_size); size_t new_committed_size = ReservedSpace::allocation_align_size_up(new_size);
size_t new_committed_card_num = size_t new_committed_card_num = committed_to_card_num(new_committed_size);
MIN2(_reserved_max_card_num, new_committed_size / sizeof(jbyte));
if (_committed_max_card_num < new_committed_card_num) { if (_committed_max_card_num < new_committed_card_num) {
// we need to expand the backing store for the card counts // we need to expand the backing store for the card counts
......
...@@ -94,6 +94,14 @@ class G1CardCounts: public CHeapObj<mtGC> { ...@@ -94,6 +94,14 @@ class G1CardCounts: public CHeapObj<mtGC> {
return (jbyte*) (_ct_bot + card_num); 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. // Clear the counts table for the given (exclusive) index range.
void clear_range(size_t from_card_num, size_t to_card_num); void clear_range(size_t from_card_num, size_t to_card_num);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册