< 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 >