diff --git a/ecmascript/common.h b/ecmascript/common.h index 9865d3541f2e9cdc7377032a8ccab4bce51cd2f4..1c32a1db46dcc60744aca3dd2bcae04126f6312a 100644 --- a/ecmascript/common.h +++ b/ecmascript/common.h @@ -72,7 +72,6 @@ enum class RequestAotMode : uint8_t { V(ReMark) \ V(Mark) \ V(MarkRoots) \ - V(ProcessMarkStack) \ V(ProcessSharedGCRSetWorkList) \ V(Sweep) \ V(ClearNativeObject) \ diff --git a/ecmascript/mem/gc_stats.cpp b/ecmascript/mem/gc_stats.cpp index 4d64acfa6891a374ff1fc86786632d625ca2a6ca..e2354c88b6547585d58fd67cfd3b89846aa94679 100644 --- a/ecmascript/mem/gc_stats.cpp +++ b/ecmascript/mem/gc_stats.cpp @@ -218,8 +218,6 @@ void GCStats::PrintGCDurationStatistic() << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::Mark]) << "ms\n" << STATS_DESCRIPTION_FORMAT("MarkRoots:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::MarkRoots]) << "ms\n" - << STATS_DESCRIPTION_FORMAT("ProcessMarkStack:") - << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::ProcessMarkStack]) << "ms\n" << STATS_DESCRIPTION_FORMAT("Sweep:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::Sweep]) << "ms\n" << STATS_DESCRIPTION_FORMAT("Finish:") @@ -240,8 +238,6 @@ void GCStats::PrintGCDurationStatistic() << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::ConcurrentMark]) << "ms\n" << STATS_DESCRIPTION_FORMAT("WaitConcurrentMarkFinish:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::WaitConcurrentMarkFinished]) << "ms\n" - << STATS_DESCRIPTION_FORMAT("ProcessMarkStack:") - << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::ProcessMarkStack]) << "ms\n" << STATS_DESCRIPTION_FORMAT("ReMark:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::ReMark]) << "ms\n" << STATS_DESCRIPTION_FORMAT("ProcessSharedGCRSetWorkList:") @@ -280,8 +276,6 @@ void GCStats::PrintGCDurationStatistic() << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::Mark]) << "ms\n" << STATS_DESCRIPTION_FORMAT("MarkRoots:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::MarkRoots]) << "ms\n" - << STATS_DESCRIPTION_FORMAT("ProcessMarkStack:") - << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::ProcessMarkStack]) << "ms\n" << STATS_DESCRIPTION_FORMAT("Sweep:") << STATS_DATA_FORMAT(scopeDuration_[Scope::ScopeId::Sweep]) << "ms\n" << STATS_DESCRIPTION_FORMAT("Finish:") diff --git a/ecmascript/mem/linear_space.h b/ecmascript/mem/linear_space.h index 4bcd3586ec09daca3b2411cb42ac738d606997d9..1f6ea8bc700cf39fb89478099920740b11bb6ba7 100644 --- a/ecmascript/mem/linear_space.h +++ b/ecmascript/mem/linear_space.h @@ -29,10 +29,7 @@ public: void Stop(); void ResetAllocator(); void IterateOverObjects(const std::function &objectVisitor) const; - void DecreaseSurvivalObjectSize(size_t objSize) - { - survivalObjectSize_ -= objSize; - } + const uintptr_t *GetAllocationTopAddress() { return allocator_.GetTopAddress(); diff --git a/ecmascript/mem/parallel_marker.cpp b/ecmascript/mem/parallel_marker.cpp index c68f2c7595844a7686242634df126a5db1f561c8..0b02b205ba26391067a79e739c21ee9db9c4c3d0 100644 --- a/ecmascript/mem/parallel_marker.cpp +++ b/ecmascript/mem/parallel_marker.cpp @@ -118,7 +118,6 @@ void NonMovableMarker::MarkJitCodeMap(uint32_t threadId) void NonMovableMarker::ProcessMarkStack(uint32_t threadId) { - TRACE_GC(GCStats::Scope::ScopeId::ProcessMarkStack, heap_->GetEcmaVM()->GetEcmaGCStats()); bool isFullMark = heap_->IsConcurrentFullMark(); auto cb = [&](ObjectSlot s, Region *rootRegion, bool needBarrier) { MarkValue(threadId, s, rootRegion, needBarrier); @@ -159,7 +158,6 @@ void NonMovableMarker::ProcessMarkStack(uint32_t threadId) void NonMovableMarker::ProcessIncrementalMarkStack(uint32_t threadId, uint32_t markStepSize) { - TRACE_GC(GCStats::Scope::ScopeId::ProcessMarkStack, heap_->GetEcmaVM()->GetEcmaGCStats()); bool isFullMark = heap_->IsConcurrentFullMark(); uint32_t visitAddrNum = 0; auto cb = [&](ObjectSlot s, Region *rootRegion, bool needBarrier) { @@ -211,7 +209,6 @@ void SemiGCMarker::Initialize() void SemiGCMarker::ProcessMarkStack(uint32_t threadId) { - TRACE_GC(GCStats::Scope::ScopeId::ProcessMarkStack, heap_->GetEcmaVM()->GetEcmaGCStats()); auto cb = [&](ObjectSlot s, TaggedObject *root) { MarkValue(threadId, root, s); }; EcmaObjectRangeVisitor visitor = [this, threadId, cb](TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) { @@ -233,7 +230,6 @@ void SemiGCMarker::ProcessMarkStack(uint32_t threadId) void CompressGCMarker::ProcessMarkStack(uint32_t threadId) { - TRACE_GC(GCStats::Scope::ScopeId::ProcessMarkStack, heap_->GetEcmaVM()->GetEcmaGCStats()); auto cb = [&](ObjectSlot s, [[maybe_unused]] TaggedObject *root) { MarkValue(threadId, s); }; EcmaObjectRangeVisitor visitor = [this, threadId, cb](TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) { diff --git a/ecmascript/mem/shared_heap/shared_space.cpp b/ecmascript/mem/shared_heap/shared_space.cpp index 4eea2ea21a0d94de00db56278ad0cff7f52bb22f..b0a8de79eb1b82937431279e48cfc2945a18701f 100644 --- a/ecmascript/mem/shared_heap/shared_space.cpp +++ b/ecmascript/mem/shared_heap/shared_space.cpp @@ -54,9 +54,8 @@ void SharedSparseSpace::ResetTopPointer(uintptr_t top) uintptr_t SharedSparseSpace::AllocateWithoutGC(JSThread *thread, size_t size) { uintptr_t object = TryAllocate(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); object = AllocateWithExpand(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); return object; } @@ -77,18 +76,18 @@ uintptr_t SharedSparseSpace::Allocate(JSThread *thread, size_t size, bool allowG localHeap->TryTriggerFullMarkBySharedSize(size); } uintptr_t object = TryAllocate(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); if (sweepState_ == SweepState::SWEEPING) { object = AllocateAfterSweepingCompleted(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); } // Check whether it is necessary to trigger Shared GC before expanding to avoid OOM risk. if (allowGC && sHeap_->CheckAndTriggerSharedGC(thread)) { object = TryAllocate(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); } object = AllocateWithExpand(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); if (allowGC) { sHeap_->CollectGarbage(thread); object = Allocate(thread, size, false); @@ -99,14 +98,13 @@ uintptr_t SharedSparseSpace::Allocate(JSThread *thread, size_t size, bool allowG uintptr_t SharedSparseSpace::TryAllocateAndExpand(JSThread *thread, size_t size, bool expand) { uintptr_t object = TryAllocate(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); if (sweepState_ == SweepState::SWEEPING) { object = AllocateAfterSweepingCompleted(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); } if (expand) { object = AllocateWithExpand(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); } return object; } @@ -120,10 +118,9 @@ uintptr_t SharedSparseSpace::AllocateNoGCAndExpand(JSThread *thread, size_t size } #endif uintptr_t object = TryAllocate(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); + CHECK_SOBJECT_NOT_NULL(); if (sweepState_ == SweepState::SWEEPING) { object = AllocateAfterSweepingCompleted(thread, size); - CHECK_SOBJECT_AND_INC_OBJ_SIZE(size); } return object; } @@ -131,7 +128,9 @@ uintptr_t SharedSparseSpace::AllocateNoGCAndExpand(JSThread *thread, size_t size uintptr_t SharedSparseSpace::TryAllocate([[maybe_unused]] JSThread *thread, size_t size) { LockHolder lock(allocateLock_); - return allocator_->Allocate(size); + uintptr_t object = allocator_->Allocate(size); + IncAllocSObjectSize(object, size); + return object; } uintptr_t SharedSparseSpace::AllocateWithExpand(JSThread *thread, size_t size) @@ -143,6 +142,7 @@ uintptr_t SharedSparseSpace::AllocateWithExpand(JSThread *thread, size_t size) if (object == 0 && Expand(thread)) { object = allocator_->Allocate(size); } + IncAllocSObjectSize(object, size); return object; } @@ -184,18 +184,24 @@ void SharedSparseSpace::MergeDeserializeAllocateRegions(const std::vectorAllocate(size); + object = allocator_->Allocate(size); + IncAllocSObjectSize(object, size); + return object; } if (TryFillSweptRegion()) { - auto object = allocator_->Allocate(size); + object = allocator_->Allocate(size); + IncAllocSObjectSize(object, size); if (object != 0) { return object; } } // Parallel sweep and fill sHeap_->GetSweeper()->EnsureTaskFinished(spaceType_); - return allocator_->Allocate(size); + object = allocator_->Allocate(size); + IncAllocSObjectSize(object, size); + return object; } void SharedSparseSpace::PrepareSweeping() @@ -388,6 +394,19 @@ void SharedSparseSpace::CheckAndTriggerLocalFullMark(JSThread *thread) } } +void SharedSparseSpace::IncAllocSObjectSize(uintptr_t object, size_t size) +{ + if (object != 0) { + IncreaseLiveObjectSize(size); + if (sHeap_->IsReadyToConcurrentMark()) { + Region::ObjectAddressToRange(object)->IncreaseAliveObject(size); + } +#ifdef ECMASCRIPT_SUPPORT_HEAPSAMPLING + InvokeAllocationInspector(object, size, size); +#endif + } +} + SharedAppSpawnSpace::SharedAppSpawnSpace(SharedHeap *heap, size_t initialCapacity) : SharedSparseSpace(heap, MemSpaceType::SHARED_APPSPAWN_SPACE, initialCapacity, initialCapacity) { diff --git a/ecmascript/mem/shared_heap/shared_space.h b/ecmascript/mem/shared_heap/shared_space.h index dc5b7fc658d1a50475f0e5a37f7735ec645e2e08..0f6a368618a8cd028111f7a2e87b8f6cb3d85054 100644 --- a/ecmascript/mem/shared_heap/shared_space.h +++ b/ecmascript/mem/shared_heap/shared_space.h @@ -20,26 +20,10 @@ #include "ecmascript/mem/sparse_space.h" namespace panda::ecmascript { -#ifdef ECMASCRIPT_SUPPORT_HEAPSAMPLING -#define CHECK_SOBJECT_AND_INC_OBJ_SIZE(size) \ +#define CHECK_SOBJECT_NOT_NULL() \ if (object != 0) { \ - IncreaseLiveObjectSize(size); \ - if (sHeap_->IsReadyToConcurrentMark()) { \ - Region::ObjectAddressToRange(object)->IncreaseAliveObject(size); \ - } \ - InvokeAllocationInspector(object, size, size); \ return object; \ } -#else -#define CHECK_SOBJECT_AND_INC_OBJ_SIZE(size) \ - if (object != 0) { \ - IncreaseLiveObjectSize(size); \ - if (heap_->IsReadyToConcurrentMark()) { \ - Region::ObjectAddressToRange(object)->IncreaseAliveObject(size); \ - } \ - return object; \ - } -#endif class SharedHeap; class SharedLocalSpace; @@ -127,6 +111,7 @@ private: uintptr_t TryAllocate(JSThread *thread, size_t size); // For sweeping uintptr_t AllocateAfterSweepingCompleted(JSThread *thread, size_t size); + void IncAllocSObjectSize(uintptr_t object, size_t size); Mutex lock_; Mutex allocateLock_; diff --git a/ecmascript/module/js_module_manager.h b/ecmascript/module/js_module_manager.h index fc88241e67e432661ed92617825b541fb5573ec9..0351f1900d7d21f1e10cc6e835ffa0d83ca8c586 100644 --- a/ecmascript/module/js_module_manager.h +++ b/ecmascript/module/js_module_manager.h @@ -98,11 +98,11 @@ public: bool GetExecuteMode() const { - return isExecuteBuffer_; + return isExecuteBuffer_.load(std::memory_order_acquire); } void SetExecuteMode(bool mode) { - isExecuteBuffer_ = mode; + isExecuteBuffer_.store(mode, std::memory_order_release); } static CString PUBLIC_API GetRecordName(JSTaggedValue module); @@ -176,7 +176,7 @@ private: EcmaVM *vm_ {nullptr}; CUnorderedMap resolvedModules_; - bool isExecuteBuffer_ {false}; + std::atomic isExecuteBuffer_ {false}; CVector InstantiatingSModuleList_; friend class EcmaVM; diff --git a/ecmascript/shared_object_factory.cpp b/ecmascript/shared_object_factory.cpp index 036cfe2ffff6df66ee14985335bad67668879201..2f36875129a6a8d692731dfc4ca3f611477bca77 100644 --- a/ecmascript/shared_object_factory.cpp +++ b/ecmascript/shared_object_factory.cpp @@ -49,7 +49,7 @@ void ObjectFactory::NewSObjectHook() const if (count++ % frequency == 0) { if (count % (CONCURRENT_MARK_FREQUENCY_FACTOR * frequency) == 0) { sHeap_->CollectGarbage(thread_); - } else { + } else if (sHeap_->CheckCanTriggerConcurrentMarking(thread_)) { sHeap_->TriggerConcurrentMarking(thread_); } if (!ecmascript::AnFileDataManager::GetInstance()->IsEnable()) {