--- old/src/hotspot/share/gc/z/zMark.cpp 2019-09-04 13:48:36.091089637 +0200 +++ new/src/hotspot/share/gc/z/zMark.cpp 2019-09-04 13:48:35.771078807 +0200 @@ -133,6 +133,9 @@ // Update thread local address bad mask ZThreadLocalData::set_address_bad_mask(thread, ZAddressBadMask); + // Mark invisible root + ZThreadLocalData::do_invisible_root(thread, ZBarrier::mark_barrier_on_invisible_root_oop_field); + // Retire TLAB ZThreadLocalAllocBuffer::retire(thread); } @@ -156,7 +159,7 @@ ZMarkRootsTask(ZMark* mark) : ZTask("ZMarkRootsTask"), _mark(mark), - _roots(true /* visit_invisible */, false /* visit_jvmti_weak_export */) {} + _roots(false /* visit_jvmti_weak_export */) {} virtual void work() { _roots.oops_do(&_cl); @@ -282,7 +285,7 @@ follow_array(addr, size, finalizable); } -void ZMark::follow_array_object(objArrayOop obj, bool finalizable) { +void ZMark::follow_array_object(objArrayOop obj, bool follow, bool finalizable) { if (finalizable) { ZMarkBarrierOopClosure cl; cl.do_klass(obj->klass()); @@ -291,10 +294,11 @@ cl.do_klass(obj->klass()); } - const uintptr_t addr = (uintptr_t)obj->base(); - const size_t size = (size_t)obj->length() * oopSize; - - follow_array(addr, size, finalizable); + if (follow) { + const uintptr_t addr = (uintptr_t)obj->base(); + const size_t size = (size_t)obj->length() * oopSize; + follow_array(addr, size, finalizable); + } } void ZMark::follow_object(oop obj, bool finalizable) { @@ -348,7 +352,7 @@ } if (is_array(addr)) { - follow_array_object(objArrayOop(ZOop::from_address(addr)), finalizable); + follow_array_object(objArrayOop(ZOop::from_address(addr)), entry.follow(), finalizable); } else { follow_object(ZOop::from_address(addr), finalizable); }