RFR: Remove over-strict assert_not_forwarded() in ShConcMark

Roman Kennke rkennke at redhat.com
Fri Apr 20 09:52:37 UTC 2018


After updating refs in ShConcMark, we check that the ref is not
forwarded. It turns out that this is overly strict: it can happen in
case of arraycopy and clone, that from-space oops are written to
to-space refs. However, this is a temporary situation: the
arraycopy/clone post-barrier will scan the copy and update all refs. It
can still happen we trip this assert though. I propose to remove the
assert. I don't really have a better way to fix this. (Suggestions
welcome!).

I found this during merge, but think it should go separately for backports.

diff --git
a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
--- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
@@ -256,7 +256,6 @@
     // It happens when a mutator thread beats us by writing another
value. In that
     // case we don't need to do anything else.
     if (UPDATE_REFS != CONCURRENT || !oopDesc::is_null(obj)) {
-      shenandoah_assert_not_forwarded(p, obj);
       shenandoah_assert_not_in_cset_except(p, obj,
heap->cancelled_concgc());

       if (heap->mark_next(obj)) {





More information about the shenandoah-dev mailing list