RFR(S): 7190666: G1: assert(_unused == 0) failed: Inconsistency in PLAB stats

John Cuthbertson john.cuthbertson at oracle.com
Tue Aug 28 00:36:26 UTC 2012


Hi Everyone,

Can I have a couple of volunteers review the changes for this CR? The 
webrev can be found at: http://cr.openjdk.java.net/~johnc/7190666/webrev.0/

Summary:
The value of PLABStats::_allocated was overflowing and the failed 
assertion detected when it overflowed to 0. When we retired an 
individual allocation buffer, we were flushing some accumulated values 
to the associated PLABStats instance. This was artificially inflating 
the values in the PLABStats instance since we were not reseting the 
accumulated values in the ParGCAllocBuffer after we flushed. Ordinarily 
this would not cause an issue (other than the values being too large) 
but with this particular test case we obtained an evacuation failure. As 
a result we were executing the GC allocation slow-path, and flushing the 
accumulated values, for every failed attempted object allocation (even 
though we were unable to allocate a new buffer), and we overflowed. 
Reseting the sensor values in the ParGCAllocBuffer instance after 
flushing prevents the artificial inflation and overflow.

Additionally we should not be flushing the values to the PLABStats 
instance on every buffer retirement (though it is not stated in the 
code). Flushing the stats values on every retirement is unnecessary and, 
in the case of an evacuation, adds a fair amount of additional work for 
each failed object copy. Instead we should only be flushing the 
accumulated sensor values when we retire the final buffers prior to 
disposing the G1ParScanThreadState object.

Testing:
The failing test case; the GC test suite with +PrintPLAB, and jprt.

Note while testing this I ran into some assertion and guarantee failures 
from G1's block offset table. I've only seen and been able (so far) to 
reproduce these failures on a single machine in the jprt pool. I will be 
submitting a new CR for these failures. I do not believe that the 
failures are related to this fix (or the change that enabled resize-able 
PLABS) as I've been able to reproduce the failures with disabling 
ResizePLAB and setting OldPLABSize=8k, 16k, and 32k.

Thanks,

JohnC



More information about the hotspot-gc-dev mailing list