--- old/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp 2014-12-18 11:26:51.328555558 +0100 +++ new/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp 2014-12-18 11:26:51.250553277 +0100 @@ -681,17 +681,16 @@ clear_fcc(); } -bool OtherRegionsTable::occupancy_less_or_equal_than(size_t occ) const { - guarantee(occ <= (size_t)G1RSetSparseRegionEntries, - err_msg("Requested maximum occupancy must be smaller or equal than " - SIZE_FORMAT" but is " SIZE_FORMAT, (size_t)G1RSetSparseRegionEntries, occ)); - // The following statement is a simplification: although the predicate gives a - // value for the maximum total allowed remembered set entries we always only - // ever check the sparse remembered set for it. - // Getting the actual occupancy of even a single fine remembered set (a single - // coarse entry will almost always exceed the number the sparse remembered set can - // hold so we just check for zero here) is very expensive, so we do not do it. - return occ_coarse() == 0 && _first_all_fine_prts == NULL && occ_sparse() <= occ; +bool OtherRegionsTable::occupancy_less_or_equal_than(size_t limit) const { + if (limit <= (size_t)G1RSetSparseRegionEntries) { + return occ_coarse() == 0 && _first_all_fine_prts == NULL && occ_sparse() <= limit; + } else { + // Current uses of this method may only use values less than G1RSetSparseRegionEntries + // for the limit. The solution, comparing against occupied() would be too slow + // at this time. + Unimplemented(); + return false; + } } bool OtherRegionsTable::is_empty() const {