Mon, 04 Apr 2011 13:18:35 -0400
7033292: G1: nightly failure: Non-dirty cards in region that should be dirty
Summary: The epochs on the card cache array are initialized to 0 and our initial epoch also starts at 0. So, until the first GC, it might be possible to successfully "claim" a card which was in fact never initialized.
Reviewed-by: johnc, iveresov, ysr
src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Wed Mar 30 10:26:59 2011 -0400 1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Mon Apr 04 13:18:35 2011 -0400 1.3 @@ -51,7 +51,11 @@ 1.4 _cache_size_index(0), _expand_card_counts(false), 1.5 _hot_cache(NULL), 1.6 _def_use_cache(false), _use_cache(false), 1.7 - _n_periods(0), 1.8 + // We initialize the epochs of the array to 0. By initializing 1.9 + // _n_periods to 1 and not 0 we automatically invalidate all the 1.10 + // entries on the array. Otherwise we might accidentally think that 1.11 + // we claimed a card that was in fact never set (see CR7033292). 1.12 + _n_periods(1), 1.13 _threads(NULL), _n_threads(0) 1.14 { 1.15