6916968: CMS: freeList.cpp:304 assert(_allocation_stats.prevSweep() + ..., "Conservation Principle")
Summary: Fix assert and adjust demand volume computation by adding missing factor.
Reviewed-by: jmasa, tonyp
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp Thu Jun 16 15:51:57 2011 -0400
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp Mon Jun 20 09:42:26 2011 -0700
@@ -300,8 +300,21 @@
// dictionary for example, this might be the first block and
// in that case there would be no place that we could record
// the stats (which are kept in the block itself).
- assert(_allocation_stats.prevSweep() + _allocation_stats.splitBirths() + 1 // Total Stock + 1
- >= _allocation_stats.splitDeaths() + (ssize_t)count(), "Conservation Principle");
+ assert((_allocation_stats.prevSweep() + _allocation_stats.splitBirths()
+ + _allocation_stats.coalBirths() + 1) // Total Production Stock + 1
+ >= (_allocation_stats.splitDeaths() + _allocation_stats.coalDeaths()
+ + (ssize_t)count()), // Total Current Stock + depletion
+ err_msg("FreeList " PTR_FORMAT " of size " SIZE_FORMAT
+ " violates Conservation Principle: "
+ "prevSweep(" SIZE_FORMAT ")"
+ " + splitBirths(" SIZE_FORMAT ")"
+ " + coalBirths(" SIZE_FORMAT ") + 1 >= "
+ " splitDeaths(" SIZE_FORMAT ")"
+ " coalDeaths(" SIZE_FORMAT ")"
+ " + count(" SSIZE_FORMAT ")",
+ this, _size, _allocation_stats.prevSweep(), _allocation_stats.splitBirths(),
+ _allocation_stats.splitBirths(), _allocation_stats.splitDeaths(),
+ _allocation_stats.coalDeaths(), count()));
}
void FreeList::assert_proper_lock_protection_work() const {
--- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Thu Jun 16 15:51:57 2011 -0400
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Mon Jun 20 09:42:26 2011 -0700
@@ -99,14 +99,16 @@
// vulnerable to noisy glitches. In such cases, we
// ignore the current sample and use currently available
// historical estimates.
- // XXX NEEDS TO BE FIXED
- // assert(prevSweep() + splitBirths() >= splitDeaths() + (ssize_t)count, "Conservation Principle");
- // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- // "Total Stock" "Not used at this block size"
+ assert(prevSweep() + splitBirths() + coalBirths() // "Total Production Stock"
+ >= splitDeaths() + coalDeaths() + (ssize_t)count, // "Current stock + depletion"
+ "Conservation Principle");
if (inter_sweep_current > _threshold) {
- ssize_t demand = prevSweep() - (ssize_t)count + splitBirths() - splitDeaths();
- // XXX NEEDS TO BE FIXED
- // assert(demand >= 0, "Demand should be non-negative");
+ ssize_t demand = prevSweep() - (ssize_t)count + splitBirths() + coalBirths()
+ - splitDeaths() - coalDeaths();
+ assert(demand >= 0,
+ err_msg("Demand (" SSIZE_FORMAT ") should be non-negative for "
+ PTR_FORMAT " (size=" SIZE_FORMAT ")",
+ demand, this, count));
// Defensive: adjust for imprecision in event counting
if (demand < 0) {
demand = 0;