RFR(XS): 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
John Cuthbertson
john.cuthbertson at oracle.com
Wed Jan 30 19:19:11 UTC 2013
Hi Everyone,
Can I have a couple volunteers review the changes for this CR - the
webrev can be found at: http://cr.openjdk.java.net/~johnc/8001384/webrev.0/
Background:
The ReduceInitialCardMarks optimization allows the JIT compiler, in some
circumstances, to skip generation of the card marks associated with the
initializing stores of a newly allocated object. The skipped card marks
are then elided into a single deferred operation.
The deferred card marks are recorded in a field in the allocating
thread. Typically deferred card marks are flushed (and the associated
cards dirtied) when another set of card marks is to be deferred for the
same thread, or at the start of the next GC (in
CollectedHeap::ensure_parseability()).
The problem here was that the deferred card marks, if any, for a given
thread were not being flushed when that thread exited. As a result we
would end up with missing (card marks) write barriers, (in the case of
G1) missing RSet entries, and dangling references.
The fix is, obviously, flush any deferred cards marks before the thread
exits, and before flushing the G1 dirty card queue for the thread.
Although the problem was found by G1's marking verification
(VerifyDuringGC) occasionally detecting missing RSet entries and
dangling references, I believe this issue affects all the collectors.
Testing:
runThese bigapp on the failing machine with IHOP=10 and marking
verification;
runThese on my local workstation with IHOP=5 and marking verification;
gc test suite to sanity test the other collectors.
Thanks,
JohnC
More information about the hotspot-gc-dev
mailing list