RFR(S): 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
john.cuthbertson at oracle.com
Mon May 16 16:09:01 PDT 2011
Can I have a couple of volunteers to review the fix for this CR - the
webrev can be found at: http://cr.openjdk.java.net/~johnc/7041440/webrev.0
The issue here was that, during a marking cycle, we had a heap region
(R) that was allocated as a young GC alloc region during an evacuation
pause (pause A). In the same pause it was retired and its NTAMS value
was set to top(). It was also added to the collection set for the next
evacuation pause (pause B).
After pause A, a concurrent marking task claimed region R and started to
scan it. Because of the test configuration the concurrent marking did
not run for very long before pause B.
During pause B, region R was evacuated and added to the free list. The
concurrent mark task which had earlier claimed R for scanning was still
holding on to it.
During a subsequent evacuation pause region R was allocated as an old GC
alloc region. When R was retired its NTAMS was set to top().
During the subsequent concurrent marking, the region fields in the
concurrent marking task were updated resulting in the value of the task
local finger being set to R's NTAMS value - effectively skipping
scanning the objects copied into R when it was an old GC alloc region.
The solution is, during an evacuation pause, to scan the local fingers
of the concurrent marking tasks. If we find local finger that points
into the collection set then we need to have the concurrent mark task
give up that claimed region as the values in the region fields will
become stale. This will cause the concurrent mark task to claim a new
region when marking restarts after the pause.
Testing: the original failing test case; gc test suite with a low
marking threshold. A jprt test job is in the queue.
More information about the hotspot-gc-dev