diff --git a/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state-inl.h b/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state-inl.h index dd83433f12882ea5302760dc82d133485b6a61c3..bbb8f44d39250a4b23913274c490fe3778c46d9d 100644 --- a/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state-inl.h +++ b/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state-inl.h @@ -218,5 +218,26 @@ void G1EvacuateRegionsWorkerState::EvacuateLiveObjects() { refStack_->TraverseObjects(*this); } + +template +void G1EvacuateRegionsWorkerState::PrintObjectEvents(const CollectionSet &collectionSet) +{ + for (auto *region : collectionSet) { + auto objectVisitor = [region](ObjectHeader *obj) { + MarkWord markWord = obj->GetMark(); + if (markWord.IsForwarded()) { + auto dst = reinterpret_cast(markWord.GetForwardingAddress()); + LOG_DEBUG_OBJECT_EVENTS << "MOVE object " << obj << " -> " << dst << " region " << region; + } else if (region->HasFlag(RegionFlag::IS_OLD)) { + LOG_DEBUG_OBJECT_EVENTS << "DELETE tenured object " << obj << " region " << region; + } else { + ASSERT(region->HasFlag(RegionFlag::IS_EDEN)); + LOG_DEBUG_OBJECT_EVENTS << "DELETE young object " << obj << " region " << region; + } + }; + region->IterateOverObjects(objectVisitor); + } +} + } // namespace ark::mem #endif diff --git a/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state.h b/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state.h index 2af9d6969a633f705e5412db34284a449390ae4b..6ff3d79c2ec1e46b7ba0e9004c913dbd03c711ea 100644 --- a/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state.h +++ b/static_core/runtime/mem/gc/g1/g1-evacuate-regions-worker-state.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -111,6 +111,7 @@ public: } void EvacuateLiveObjects(); + void PrintObjectEvents(const CollectionSet &collectionSet); void EvacuateNonHeapRoots(); size_t ScanRemset(const RemSet<> &remset); diff --git a/static_core/runtime/mem/gc/g1/g1-gc.cpp b/static_core/runtime/mem/gc/g1/g1-gc.cpp index 980ed9365824598eadfbb5fe988257c8f0f0e891..7729f69b3a61ce368ad05f79e1c0fdd5a67929d8 100644 --- a/static_core/runtime/mem/gc/g1/g1-gc.cpp +++ b/static_core/runtime/mem/gc/g1/g1-gc.cpp @@ -1362,6 +1362,10 @@ void G1GC::EvacuateCollectionSet(const RemSet<> &remset) analytics_.ReportEvacuationStart(startEvacuation); state.EvacuateLiveObjects(); + if (static_cast(LOG_DEBUG_OBJECT_EVENTS)) { + state.PrintObjectEvents(collectionSet_); + } + ASSERT(refStack.Empty()); if (useGcWorkers) { this->GetWorkersTaskPool()->WaitUntilTasksEnd();