From f60cf5832e5c3564fb7377d0f45bdedf456f589b Mon Sep 17 00:00:00 2001 From: Stefan Karlsson Date: Mon, 11 May 2026 11:37:09 +0000 Subject: [PATCH] 8384143: ZGC: Add minor performance improvment to oop iteration during flip promotion Reviewed-by: ayang, sjohanss --- src/hotspot/share/gc/z/zIterator.hpp | 5 ++++ src/hotspot/share/gc/z/zIterator.inline.hpp | 28 ++++++++++++++++----- src/hotspot/share/gc/z/zRelocate.cpp | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/gc/z/zIterator.hpp b/src/hotspot/share/gc/z/zIterator.hpp index e048002e52e..0e9ef808dff 100644 --- a/src/hotspot/share/gc/z/zIterator.hpp +++ b/src/hotspot/share/gc/z/zIterator.hpp @@ -31,11 +31,14 @@ class ZIterator : AllStatic { private: static bool is_invisible_object(oop obj); static bool is_invisible_object_array(oop obj); + static bool is_invisible_object_array(oop obj, Klass* klass); public: // This iterator skips invisible roots template static void oop_iterate_safe(oop obj, OopClosureT* cl); + template + static void oop_iterate_safe(oop obj, Klass* klass, OopClosureT* cl); template static void oop_iterate(oop obj, OopClosureT* cl); @@ -46,6 +49,8 @@ public: // This function skips invisible roots template static void basic_oop_iterate_safe(oop obj, Function function); + template + static void basic_oop_iterate_safe(oop obj, Klass* klass, Function function); template static void basic_oop_iterate(oop obj, Function function); diff --git a/src/hotspot/share/gc/z/zIterator.inline.hpp b/src/hotspot/share/gc/z/zIterator.inline.hpp index cbfe1a79aaf..6e51929c7b4 100644 --- a/src/hotspot/share/gc/z/zIterator.inline.hpp +++ b/src/hotspot/share/gc/z/zIterator.inline.hpp @@ -45,17 +45,27 @@ inline bool ZIterator::is_invisible_object(oop obj) { } inline bool ZIterator::is_invisible_object_array(oop obj) { - return obj->klass()->is_objArray_klass() && is_invisible_object(obj); + return is_invisible_object_array(obj, obj->klass()); } -// This iterator skips invisible object arrays +inline bool ZIterator::is_invisible_object_array(oop obj, Klass* klass) { + return klass->is_objArray_klass() && is_invisible_object(obj); +} + +// These iterators skips invisible object arrays + template void ZIterator::oop_iterate_safe(oop obj, OopClosureT* cl) { + oop_iterate_safe(obj, obj->klass(), cl); +} + +template +void ZIterator::oop_iterate_safe(oop obj, Klass* klass, OopClosureT* cl) { // Skip invisible object arrays - we only filter out *object* arrays, // because that check is arguably faster than the is_invisible_object // check, and primitive arrays are cheap to call oop_iterate on. - if (!is_invisible_object_array(obj)) { - obj->oop_iterate(cl); + if (!is_invisible_object_array(obj, klass)) { + OopIteratorClosureDispatch::oop_oop_iterate(cl, obj, klass); } } @@ -89,11 +99,17 @@ public: } }; -// This function skips invisible roots +// These functions skip invisible roots + template void ZIterator::basic_oop_iterate_safe(oop obj, Function function) { + basic_oop_iterate_safe(obj, obj->klass(), function); +} + +template +void ZIterator::basic_oop_iterate_safe(oop obj, Klass* klass, Function function) { ZBasicOopIterateClosure cl(function); - oop_iterate_safe(obj, &cl); + oop_iterate_safe(obj, klass, &cl); } template diff --git a/src/hotspot/share/gc/z/zRelocate.cpp b/src/hotspot/share/gc/z/zRelocate.cpp index d51cf5abbae..1c2a4078904 100644 --- a/src/hotspot/share/gc/z/zRelocate.cpp +++ b/src/hotspot/share/gc/z/zRelocate.cpp @@ -1272,7 +1272,7 @@ public: for (ZPage* page; _iter.next(&page);) { page->object_iterate([&](oop obj) { // Remap oops and add remset if needed - ZIterator::basic_oop_iterate_safe(obj, remap_and_maybe_add_remset); + ZIterator::basic_oop_iterate_safe(obj, obj->klass(), remap_and_maybe_add_remset); // String dedup string_dedup_context.request(obj);