--- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Thu May 02 06:33:28 2019 -0700
+++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Thu May 02 09:49:52 2019 -0400
@@ -1487,8 +1487,13 @@
if (!cancelled_gc()) {
concurrent_mark()->finish_mark_from_roots(/* full_gc = */ false);
- if (has_forwarded_objects()) {
- concurrent_mark()->update_roots(ShenandoahPhaseTimings::update_roots);
+ // Degen may be caused by failed evacuation of roots
+ if (is_degenerated_gc_in_progress() && has_forwarded_objects()) {
+ concurrent_mark()->update_roots(ShenandoahPhaseTimings::degen_gc_update_roots);
+ }
+
+ if (ShenandoahVerify) {
+ verifier()->verify_roots_no_forwarded();
}
stop_concurrent_marking();
@@ -1540,6 +1545,7 @@
}
if (ShenandoahVerify) {
+ verifier()->verify_roots_no_forwarded();
verifier()->verify_during_evacuation();
}
} else {
@@ -2176,8 +2182,8 @@
assert(!cancelled_gc(), "Should have been done right before");
concurrent_mark()->update_roots(is_degenerated_gc_in_progress() ?
- ShenandoahPhaseTimings::degen_gc_update_roots:
- ShenandoahPhaseTimings::final_update_refs_roots);
+ ShenandoahPhaseTimings::degen_gc_update_roots:
+ ShenandoahPhaseTimings::final_update_refs_roots);
ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle);
@@ -2186,6 +2192,7 @@
set_update_refs_in_progress(false);
if (ShenandoahVerify) {
+ verifier()->verify_roots_no_forwarded();
verifier()->verify_after_updaterefs();
}