--- old/src/hotspot/share/oops/instanceMirrorKlass.inline.hpp 2017-11-20 12:42:25.494289319 +0100 +++ new/src/hotspot/share/oops/instanceMirrorKlass.inline.hpp 2017-11-20 12:42:25.093277144 +0100 @@ -71,10 +71,15 @@ Devirtualizer::do_klass(closure, klass); } } else { - // If klass is NULL then this a mirror for a primitive type. - // We don't have to follow them, since they are handled as strong - // roots in Universe::oops_do. - assert(java_lang_Class::is_primitive(obj), "Sanity check"); + // We would like to assert here (as below) that if klass has been NULL, then + // this has been a mirror for a primitive type that we do not need to follow + // as they are always strong roots. + // However, we might get across a klass that just changed during CMS concurrent + // marking if allocation occurred in the old generation. + // This is benign here, as we keep alive all CLDs that were loaded during the + // CMS concurrent phase in the class loading, i.e. they will be iterated over + // and kept alive during remark. + // assert(java_lang_Class::is_primitive(obj), "Sanity check"); } }