RFR (S): G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())

john cuthbertson - Sun Microsystems John.Cuthbertson at Sun.COM
Sat Nov 21 00:30:39 UTC 2009

Hi Everyone,

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 mailing list