JDK-8048085 optimized next bitmap clear during concurrent marking by if concurrent marking has been interrupted by full gc, G1 does not reset the next mark bitmap again because full gc already does.
The change added some assertion checking code that the next mark bitmap is clear if marking had been aborted, i.e.
if (!cm()->has_aborted()) {
SuspendibleThreadSetJoiner sts;
_cm->clearNextBitmap();
} else {
assert(!G1VerifyBitmaps || _cm->nextMarkBitmapIsClear(), "Next mark bitmap must be clear");
}
This code sometimes fails after Full GC:
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (/home/tschatzl/Downloads/vmshare/cmm-decommit/src.9/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp:286), pid=39649, tid=140275789788928
# assert(!G1VerifyBitmaps || _cm->nextMarkBitmapIsClear()) failed: Next mark bitmap must be clear
#
# JRE version: Java(TM) SE Runtime Environment (9.0-b13) (build 1.9.0-ea-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (1.9.0-fastdebug-internal mixed mode linux-amd64 compressed oops)
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
Can be reproduced fairly well (one out of 30 times?) with code that stresses concurrent marking a lot.