--- a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp Mon Mar 26 16:51:43 2018 +0200
+++ b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp Mon Mar 26 16:51:43 2018 +0200
@@ -143,10 +143,12 @@
return;
}
- HeapRegion* to = _g1->heap_region_containing(obj);
+ HeapRegionRemSet* to_rem_set = _g1->heap_region_containing(obj)->rem_set();
- assert(to->rem_set() != NULL, "Need per-region 'into' remsets.");
- to->rem_set()->add_reference(p, _worker_i);
+ assert(to_rem_set != NULL, "Need per-region 'into' remsets.");
+ if (to_rem_set->is_tracked()) {
+ to_rem_set->add_reference(p, _worker_i);
+ }
}
template <class T>
@@ -267,4 +269,20 @@
}
}
}
+
+template <class T> void G1RebuildRemSetClosure::do_oop_nv(T* p) {
+ oop const obj = RawAccess<MO_VOLATILE>::oop_load(p);
+ if (obj == NULL) {
+ return;
+ }
+
+ if (HeapRegion::is_in_same_region(p, obj)) {
+ return;
+ }
+
+ HeapRegion* to = _g1->heap_region_containing(obj);
+ HeapRegionRemSet* rem_set = to->rem_set();
+ rem_set->add_reference(p, _worker_id);
+}
+
#endif // SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP