--- a/src/hotspot/share/gc/z/zMark.cpp Mon Sep 09 16:34:45 2019 +0200
+++ b/src/hotspot/share/gc/z/zMark.cpp Tue Sep 10 11:11:31 2019 +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);
@@ -339,7 +342,7 @@
return;
}
- // Decode object address
+ // Decode object address and follow flag
const uintptr_t addr = entry.object_address();
if (!try_mark_object(cache, addr, finalizable)) {
@@ -348,7 +351,13 @@
}
if (is_array(addr)) {
- follow_array_object(objArrayOop(ZOop::from_address(addr)), finalizable);
+ // Decode follow flag
+ const bool follow = entry.follow();
+
+ // The follow flag is currently only relevant for object arrays
+ if (follow) {
+ follow_array_object(objArrayOop(ZOop::from_address(addr)), finalizable);
+ }
} else {
follow_object(ZOop::from_address(addr), finalizable);
}