From 49be2f4e1295fda1549ed08f1be9c7b64f232d12 Mon Sep 17 00:00:00 2001 From: zbx Date: Fri, 21 Mar 2025 15:12:42 +0800 Subject: [PATCH] Log MarkReason Issue: IBV9GQ Signed-off-by: zbx Change-Id: Id916cae965ef8bb9851717ca977952245973cef5 --- ecmascript/mem/gc_stats.cpp | 54 ++++++++++++++++++- ecmascript/mem/gc_stats.h | 2 + ecmascript/mem/long_gc_stats.h | 11 ++++ .../platform/unix/ohos/dfx_hisys_event.cpp | 1 + 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/ecmascript/mem/gc_stats.cpp b/ecmascript/mem/gc_stats.cpp index 509c7d459b..ec23668c8e 100644 --- a/ecmascript/mem/gc_stats.cpp +++ b/ecmascript/mem/gc_stats.cpp @@ -48,7 +48,8 @@ void GCStats::PrintGCStatistic() << sizeToMB(recordData_[(uint8_t)RecordData::END_COMMIT_SIZE]) << ") MB, " << scopeDuration_[Scope::ScopeId::TotalGC] << "(+" << GetConcurrrentMarkDuration() - << ")ms, " << GCReasonToString(gcReason_); + << ")ms, GCReason: " << GCReasonToString() + << ", MarkReason: " << MarkReasonToString(); LOG_GC(INFO) << "IsInBackground: " << heap_->IsInBackground() << "; " << "SensitiveStatus: " << static_cast(heap_->GetSensitiveStatus()) << "; " << "StartupStatus: " << std::to_string(static_cast(heap_->GetStartupStatus())) << "; " @@ -85,6 +86,16 @@ const char *GCStats::GCReasonToString(GCReason reason) return "Worker Destruction"; case GCReason::TRIGGER_BY_JS: return "Trigger by JS"; + case GCReason::HINT_GC: + return "Trigger by hint"; + case GCReason::NATIVE_LIMIT: + return "Native reach limit"; + case GCReason::SHARED_LIMIT: + return "Shared reach limit"; + case GCReason::IDLE_NATIVE: + return "Idle time task by native"; + case GCReason::HANDLE_MARKING_FINISHED: + return "ConcurrentMark finished"; case GCReason::TRIGGER_BY_ARKUI: return "Trigger by ArkUI"; case GCReason::TRIGGER_BY_ABILITY: @@ -98,6 +109,41 @@ const char *GCStats::GCReasonToString(GCReason reason) } } +const char *GCStats::MarkReasonToString() +{ + return concurrentMark_ ? MarkReasonToString(markReason_) : "Not ConcurrentMark"; +} + +const char *GCStats::MarkReasonToString(MarkReason reason) +{ + switch (reason) { + case MarkReason::ALLOCATION_LIMIT: + return "Memory reach limit"; + case MarkReason::OLD_GC_WITHOUT_FULLMARK: + return "OldGC without concurrent full mark"; + case MarkReason::IDLE: + return "Idle time task"; + case MarkReason::EXIT_HIGH_SENSITIVE: + return "Exit high sensitive"; + case MarkReason::EXTERNAL_TRIGGER: + return "Externally triggered"; + case MarkReason::WORKER_DESTRUCTION: + return "Worker Destruction"; + case MarkReason::TRIGGER_BY_JS: + return "Trigger by JS"; + case MarkReason::HINT_GC: + return "Trigger by hint"; + case MarkReason::NATIVE_LIMIT: + return "Native reach limit"; + case MarkReason::SHARED_LIMIT: + return "Shared reach limit"; + case MarkReason::EXIT_SERIALIZE: + return "Exit serialize"; + default: // LCOV_EXCL_BR_LINE + return "Other"; + } +} + float GCStats::GetConcurrrentMarkDuration() { return concurrentMark_ ? scopeDuration_[Scope::ScopeId::ConcurrentMark] : 0; @@ -486,6 +532,7 @@ void GCStats::ProcessAfterLongGCStats() if (IsLongGC(gcReason_, heap_->InSensitiveStatus(), heap_->IsInBackground(), gcTotalTime)) { longGCStats->SetGCType(static_cast(gcType_)); longGCStats->SetGCReason(static_cast(gcReason_)); + longGCStats->SetMarkReason(static_cast(markReason_)); longGCStats->SetGCIsSensitive(heap_->InSensitiveStatus()); longGCStats->SetGCIsInBackground(heap_->IsInBackground()); longGCStats->SetGCTotalTime(gcTotalTime); @@ -660,7 +707,9 @@ void SharedGCStats::PrintGCStatistic() << sizeToMB(recordData_[(uint8_t)RecordData::START_COMMIT_SIZE]) << ") -> " << sizeToMB(recordData_[(uint8_t)RecordData::END_OBJ_SIZE]) << " (" << sizeToMB(recordData_[(uint8_t)RecordData::END_COMMIT_SIZE]) << ") MB, " - << scopeDuration_[Scope::ScopeId::TotalGC] << "ms, " << GCReasonToString(gcReason_); + << scopeDuration_[Scope::ScopeId::TotalGC] + << "ms, GCReason: " << GCReasonToString() + << ", MarkReason: " << MarkReasonToString(); PrintSharedGCDuration(); PrintGCMemoryStatistic(); PrintSharedGCSummaryStatistic(); @@ -817,6 +866,7 @@ void SharedGCStats::ProcessAfterLongGCStats() if (IsLongGC(gcReason_, sHeap_->InSensitiveStatus(), sHeap_->IsInBackground(), gcTotalTime)) { longGCStats->SetGCType(static_cast(gcType_)); longGCStats->SetGCReason(static_cast(gcReason_)); + longGCStats->SetMarkReason(static_cast(markReason_)); longGCStats->SetGCIsSensitive(sHeap_->InSensitiveStatus()); longGCStats->SetGCIsInBackground(sHeap_->IsInBackground()); longGCStats->SetGCTotalTime(gcTotalTime); diff --git a/ecmascript/mem/gc_stats.h b/ecmascript/mem/gc_stats.h index cbfa50e966..a7aed23b81 100644 --- a/ecmascript/mem/gc_stats.h +++ b/ecmascript/mem/gc_stats.h @@ -158,6 +158,8 @@ public: static const char *GCReasonToString(GCReason reason); const char *GCReasonToString(); + static const char *MarkReasonToString(MarkReason reason); + const char *MarkReasonToString(); double GetAvgSurvivalRate() { diff --git a/ecmascript/mem/long_gc_stats.h b/ecmascript/mem/long_gc_stats.h index 9e3d4ed86b..d91a3fb481 100644 --- a/ecmascript/mem/long_gc_stats.h +++ b/ecmascript/mem/long_gc_stats.h @@ -27,6 +27,7 @@ public: { gcType_ = 0; gcReason_ = 0; + markReason_ = 0; gcIsSensitive_ = false; gcIsInBackground_ = false; gcTotalTime_ = 0.0f; @@ -82,6 +83,15 @@ public: gcReason_ = gcReason; } + size_t GetMarkReason() const + { + return markReason_; + } + void SetMarkReason(size_t markReason) + { + markReason_ = markReason; + } + bool GetGCIsSensitive() const { return gcIsSensitive_; @@ -373,6 +383,7 @@ public: private: size_t gcType_ = 0; size_t gcReason_ = 0; + size_t markReason_ = 0; bool gcIsSensitive_ = false; bool gcIsInBackground_ = false; float gcTotalTime_ = 0.0f; diff --git a/ecmascript/platform/unix/ohos/dfx_hisys_event.cpp b/ecmascript/platform/unix/ohos/dfx_hisys_event.cpp index 26ee86b080..4a1df02496 100644 --- a/ecmascript/platform/unix/ohos/dfx_hisys_event.cpp +++ b/ecmascript/platform/unix/ohos/dfx_hisys_event.cpp @@ -40,6 +40,7 @@ void DFXHiSysEvent::SendLongGCEvent([[maybe_unused]] LongGCStats *longGCStats) "TID", syscall(SYS_gettid), "GC_TYPE", longGCStats->GetGCType(), "GC_REASON", longGCStats->GetGCReason(), + "MARK_REASON", longGCStats->GetMarkReason(), "GC_IS_SENSITIVE", static_cast(longGCStats->GetGCIsSensitive()), "GC_IS_INBACKGROUND", static_cast(longGCStats->GetGCIsInBackground()), "GC_TOTAL_TIME", longGCStats->GetGCTotalTime(), -- Gitee