Saw this failure during 20110430 nightly testing.
# A fatal error has been detected by the Java Runtime Environment:
# Internal Error (/tmp/jprt/P1/B/192840.iv159533/source/src/share/vm/gc_implementation/g1/concurrentMark.cpp:3409), pid=19698, tid=33
# assert(obj->is_oop_or_null(true )) failed: Error
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.
Region that was originally a survivor regions that was currently claimed by a marking task was subsequently evacuation during the next GC. During a later GC pause the region was used as old gc alloc region. When marking restarted the local finger of the task that had claimed this region was to NTAMS (the same value as top) effectively skipping the scanning a portion of this region.