RFR (S): G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
john cuthbertson - Sun Microsystems
John.Cuthbertson at Sun.COM
Fri Nov 20 16:30:39 PST 2009
Can I have a couple of volunteers to review the changes for this fix?
The webrev can be found at
http://cr.openjdk.java.net/~johnc/6902115/webrev.1/. Please note that
this webrev also contains the fix for 6899058 (sent previously) as
including the fix for that CR makes this assert easier to reproduce.
They will be pushed as separate changesets.
This assert was being tripped because one of the concurrent refine
threads was processing a dirty card when it came across an unparseable
object and the subsequent re-enqueue of the card pointer completed the
current shared update buffer, causing the completed buffer to be
enqueued. The fix is to remove the assert.
Removing the assert exposed another issue though - the value returned by
G1BlockOffsetArrayContigSpace::block_start was not the start of an oop,
resulting in a seg fault. The incorrect value was coming from the foward
walk in block_start_unsafe. I have added a block_start_careful routine
in the G1BlockOffsetArrayContigSpace based on block_at_or_preceding
after reading the comment in G1BlockOffsetSharedArray.
Testing: the original test case (gcl001), specjbb2005, refworkload, jprt.
More information about the hotspot-gc-dev