# HG changeset patch # User johnc # Date 1372696223 25200 # Node ID 5ea20b3bd249573288f67c5bbbbba570146cb8b2 # Parent b307449603510a42920f4ee6ede6d5f1418fc638 8017070: G1: assert(_card_counts[card_num] <= G1ConcRSHotCardLimit) failed Summary: The assert is invalid when a card is being refined by two different threads and its count crosses the hot threshold - the refinement count will be updated once by each thread triggering the assert. Remove the assert and update the count using a bounded expression. Reviewed-by: jmasa, tamao, brutisso diff -r b30744960351 -r 5ea20b3bd249 src/share/vm/gc_implementation/g1/g1CardCounts.cpp --- a/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Sun Jun 30 21:42:07 2013 +0200 +++ b/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Mon Jul 01 09:30:23 2013 -0700 @@ -152,12 +152,9 @@ if (card_num < _committed_max_card_num) { count = (uint) _card_counts[card_num]; if (count < G1ConcRSHotCardLimit) { - _card_counts[card_num] += 1; + _card_counts[card_num] = + (jubyte)(MIN2((uintx)(_card_counts[card_num] + 1), G1ConcRSHotCardLimit)); } - assert(_card_counts[card_num] <= G1ConcRSHotCardLimit, - err_msg("Refinement count overflow? " - "new count: "UINT32_FORMAT, - (uint) _card_counts[card_num])); } } return count;