< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp

Print this page
rev 57589 : 8237632: Shenandoah fails some vmTestbase_nsk_jvmti tests with "Forwardee must point to a heap address"

@@ -191,24 +191,28 @@
 }
 
 oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
   assert(ShenandoahLoadRefBarrier, "should be enabled");
   if (!CompressedOops::is_null(obj)) {
-    bool evac_in_progress = _heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
+    if (_heap->in_collection_set(obj)) {
     oop fwd = resolve_forwarded_not_null(obj);
-    if (evac_in_progress &&
-        _heap->in_collection_set(obj) &&
-        obj == fwd) {
+      bool evac_in_progress = _heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
+      if (evac_in_progress && obj == fwd) {
       Thread *t = Thread::current();
       ShenandoahEvacOOMScope oom_evac_scope;
       return _heap->evacuate_object(obj, t);
     } else {
       return fwd;
     }
-  } else {
-    return obj;
+    } else if (_heap->is_concurrent_traversal_in_progress() &&
+               _heap->is_degenerated_gc_in_progress()) {
+      // Traversal GC clears collection set before entering degenerated GC.
+      // At this point, marked pattern indicates forwarding.
+      return resolve_forwarded_not_null(obj);
+    }
   }
+  return obj;
 }
 
 void ShenandoahBarrierSet::on_thread_create(Thread* thread) {
   // Create thread local data
   ShenandoahThreadLocalData::create(thread);
< prev index next >