diff --git a/ecmascript/ecma_vm.cpp b/ecmascript/ecma_vm.cpp index 761862a89255f6dec75db936724a13fb310e0b59..d9f8698996c5f1127c397f05d60e3e6e59709251 100644 --- a/ecmascript/ecma_vm.cpp +++ b/ecmascript/ecma_vm.cpp @@ -193,9 +193,30 @@ bool EcmaVM::Initialize() InitializeFinish(); notificationManager_->VmStartEvent(); notificationManager_->VmInitializationEvent(0); + Platform::GetCurrentPlatform()->PostTask(std::make_unique(heap_)); return true; } +bool EcmaVM::TrimNewSpaceLimitTask::Run() +{ + sleep(THREAD_SLEEP_TIME); + if (heap_->GetMemController()->IsInAppStartup()) { + heap_->SetFromSpaceMaximumCapacity(SEMI_SPACE_SIZE_CAPACITY); + heap_->SetNewSpaceMaximumCapacity(SEMI_SPACE_SIZE_CAPACITY); + heap_->ResetAppStartup(); + } + return true; +} + +void EcmaVM::TurnDownLimit() { + sleep(THREAD_SLEEP_TIME); + if (heap_->GetMemController()->IsInAppStartup()) { + heap_->SetFromSpaceMaximumCapacity(SEMI_SPACE_SIZE_CAPACITY); + heap_->SetNewSpaceMaximumCapacity(SEMI_SPACE_SIZE_CAPACITY); + heap_->ResetAppStartup(); + } +} + void EcmaVM::InitializeEcmaScriptRunStat() { // NOLINTNEXTLINE(modernize-avoid-c-arrays) diff --git a/ecmascript/ecma_vm.h b/ecmascript/ecma_vm.h index d100ccfdba553bf475578772a48223397147111b..c7b88d2da6a5f578035467b7e21b94bf1e07d57d 100644 --- a/ecmascript/ecma_vm.h +++ b/ecmascript/ecma_vm.h @@ -32,6 +32,7 @@ #include "ecmascript/mem/heap.h" #include "ecmascript/mem/heap_roots.h" #include "ecmascript/mem/space.h" +#include "ecmascript/platform/task.h" #include "ecmascript/snapshot/mem/snapshot_serialize.h" #include "ecmascript/tooling/pt_js_extractor.h" #include "include/panda_vm.h" @@ -362,6 +363,20 @@ protected: void PrintJSErrorInfo(const JSHandle &exceptionInfo); private: + static constexpr uint32_t THREAD_SLEEP_TIME = 2; + class TrimNewSpaceLimitTask : public Task { + public: + TrimNewSpaceLimitTask(Heap *heap) : heap_(heap) {}; + ~TrimNewSpaceLimitTask() override = default; + bool Run() override; + + NO_COPY_SEMANTIC(TrimNewSpaceLimitTask); + NO_MOVE_SEMANTIC(TrimNewSpaceLimitTask); + + private: + Heap *heap_; + }; + void AddPandaFile(const panda_file::File *pf, bool isModule); void SetProgram(Program *program, const panda_file::File *pf); bool IsFrameworkPandaFile(std::string_view filename) const; @@ -432,6 +447,8 @@ private: CVector arrayBufferDataList_; CVector> pandaFileWithProgram_; + std::vector> asyncTask_ {}; + friend class SnapShotSerialize; friend class ObjectFactory; friend class ValueSerializer;