diff a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp @@ -134,10 +134,17 @@ // return from here with weak roots in progress. This is not a valid gc state // for any young collections (or allocation failures) that interrupt the old // collection. heap->concurrent_final_roots(); + // Arm the nmethods to possibly flip the barriers to idle. + vmop_entry_final_verify(); + + // Now we are back at concurrent phase, process nmethods to fix their barriers. + // TODO: Is this really safe to do when we overlap with young GC? + ShenandoahCodeRoots::disarm_nmethods(); + // After concurrent old marking finishes, we reclaim immediate garbage. Further, we may also want to expand OLD in order // to make room for anticipated promotions and/or for mixed evacuations. Mixed evacuations are especially likely to // follow the end of OLD marking. heap->rebuild_free_set_within_phase(); heap->free_set()->log_status_under_lock();