RFR(S): 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure

Bengt Rutisson bengt.rutisson at oracle.com
Tue Sep 20 08:02:24 UTC 2011

Hi John,

Looks good to me. Splitting up the should_mark information into 
should_mark_root and should_mark_copy made the change much cleaner than 
when we went over this before.

One minor thing. ConcurrentMark::grayRoot() is now called in two places. 
In both places it is preceded by a test to verify that the address is in 
the G1 heap:

HeapWord* addr = (HeapWord*)obj;
if (_g1->is_in_g1_reserved(addr)) {

What do you think about moving this test into the grayRoot() method?


On 2011-09-19 22:08, John Cuthbertson wrote:
> Hi Everyone,
> Can I have a couple of reviews of the fix for this CR? The webrev can 
> be found at: http://cr.openjdk.java.net/~johnc/7092412/webrev.0/
> Summary: As a result of the changes for 7080389, some of the roots may 
> not be marked during the initial mark pause in the event of an 
> evacuation failure. If the closure that successfully forwards an 
> object to itself is a root scanning closure and there are no other 
> paths to the object referenced from the root location then the object 
> may not be marked. This problem was discovered as a result of enabling 
> marking verification while investigating another CR (7086533). The fix 
> is to pass a flag into the evacuation failure code as to whether the 
> caller is a root scanning closure and, if that is the case, the thread 
> that successfully forwards an object to itself is then responsible for 
> marking that object.
> Testing: selected test cases for 7086533 with +VerifyDuringGC; the GC 
> test suite with a high marking threshold and +VerifyDuringGC
> Thanks,
> JohnC

More information about the hotspot-gc-dev mailing list