chunk内存统计

issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I8AZAU

Signed-off-by: liujiahua <liujiahua1997812@163.com>
Change-Id: Ied818299d8b0557ad1681afad5c49bf4cd2491cb
This commit is contained in:
liujiahua 2023-11-03 15:00:50 +08:00
parent 95e4a84a2e
commit 2f3b4f1714
10 changed files with 121 additions and 12 deletions

View File

@ -392,6 +392,7 @@ void EcmaVM::ProcessNativeDelete(const WeakRootVisitor &visitor)
JSNativePointer *object = *iter;
auto fwd = visitor(reinterpret_cast<TaggedObject *>(object));
if (fwd == nullptr) {
nativeAreaAllocator_->DecreaseNativeSizeStats(object->GetBindingSize(), object->GetNativeFlag());
object->Destroy();
iter = nativePointerList_.erase(iter);
} else {
@ -416,6 +417,7 @@ void EcmaVM::ProcessReferences(const WeakRootVisitor &visitor)
JSNativePointer *object = *iter;
auto fwd = visitor(reinterpret_cast<TaggedObject *>(object));
if (fwd == nullptr) {
nativeAreaAllocator_->DecreaseNativeSizeStats(object->GetBindingSize(), object->GetNativeFlag());
object->Destroy();
iter = nativePointerList_.erase(iter);
continue;
@ -441,6 +443,7 @@ void EcmaVM::RemoveFromNativePointerList(JSNativePointer *pointer)
auto iter = std::find(nativePointerList_.begin(), nativePointerList_.end(), pointer);
if (iter != nativePointerList_.end()) {
JSNativePointer *object = *iter;
nativeAreaAllocator_->DecreaseNativeSizeStats(object->GetBindingSize(), object->GetNativeFlag());
object->Destroy();
nativePointerList_.erase(iter);
}

View File

@ -18,6 +18,7 @@
#include "ecmascript/ecma_macros.h"
#include "ecmascript/mem/tagged_object.h"
#include "ecmascript/mem/native_area_allocator.h"
namespace panda::ecmascript {
using DeleteEntryPoint = void (*)(void *, void *);
@ -43,6 +44,7 @@ public:
SetExternalPointer(nullptr);
SetDeleter(nullptr);
SetData(nullptr);
SetNativeFlag(NativeFlag::NO_DIV);
}
inline void Detach()
@ -55,8 +57,9 @@ public:
ACCESSORS_NATIVE_FIELD(ExternalPointer, void, POINTER_OFFSET, DELETER_OFFSET);
ACCESSORS_PRIMITIVE_FIELD(Deleter, DeleteEntryPoint, DELETER_OFFSET, DATA_OFFSET)
ACCESSORS_NATIVE_FIELD(Data, void, DATA_OFFSET, DATA_SIZE_OFFSET);
ACCESSORS_PRIMITIVE_FIELD(BindingSize, uint64_t, DATA_SIZE_OFFSET, LAST_OFFSET)
ACCESSORS_PRIMITIVE_FIELD(BindingSize, uint64_t, DATA_SIZE_OFFSET, FLAG_OFFSET);
// native memory statistic flag
ACCESSORS_PRIMITIVE_FIELD(NativeFlag, NativeFlag, FLAG_OFFSET, LAST_OFFSET);
DEFINE_ALIGN_SIZE(LAST_OFFSET);
DECL_VISIT_NATIVE_FIELD(POINTER_OFFSET, DATA_SIZE_OFFSET)

View File

@ -230,12 +230,20 @@ void JSThread::Iterate(const RootVisitor &visitor, const RootRangeVisitor &range
if (vm_->GetJSOptions().EnableGlobalLeakCheck()) {
IterateHandleWithCheck(visitor, rangeVisitor);
} else {
globalStorage_->IterateUsageGlobal([visitor](Node *node) {
size_t globalCount = 0;
globalStorage_->IterateUsageGlobal([visitor, &globalCount](Node *node) {
JSTaggedValue value(node->GetObject());
if (value.IsHeapObject()) {
visitor(ecmascript::Root::ROOT_HANDLE, ecmascript::ObjectSlot(node->GetObjectAddress()));
}
globalCount++;
});
static bool hasCheckedGlobalCount = false;
static const size_t WARN_GLOBAL_COUNT = 100000;
if (!hasCheckedGlobalCount && globalCount >= WARN_GLOBAL_COUNT) {
LOG_ECMA(WARN) << "Global reference count is " << globalCount << ",It exceed the upper limit 100000!";
hasCheckedGlobalCount = true;
}
}
}

View File

@ -27,6 +27,7 @@ Area *Chunk::NewArea(size_t size)
LOG_ECMA_MEM(FATAL) << "OOM Chunk : NewArea area is nullptr";
UNREACHABLE();
}
allocator_->IncreaseNativeSizeStats(size, NativeFlag::CHUNK_MEM);
areaList_.AddNode(area);
currentArea_ = area;
return area;

View File

@ -23,6 +23,7 @@
namespace panda::ecmascript {
class NativeAreaAllocator;
enum class NativeFlag;
class PUBLIC_API Chunk {
public:

View File

@ -147,8 +147,14 @@ void GCStats::PrintGCMemoryStatistic()
<< STATS_DESCRIPTION_FORMAT("Native memory usage size:")
<< STATS_DATA_FORMAT(sizeToMB(nativeAreaAllocator->GetNativeMemoryUsage())) << "MB\n"
<< STATS_DESCRIPTION_FORMAT("NativeBindingSize:")
<< STATS_DATA_FORMAT(sizeToKB(heap_->GetNativeBindingSize())) << "KB";
<< STATS_DATA_FORMAT(sizeToKB(heap_->GetNativeBindingSize())) << "KB\n"
<< STATS_DESCRIPTION_FORMAT("ArrayBufferNativeSize:")
<< STATS_DATA_FORMAT(sizeToKB(heap_->GetNativeAreaAllocator()->GetArrayBufferNativeSize()))
<< "KB\n"
<< STATS_DESCRIPTION_FORMAT("RegExpByteCodeNativeSize:")
<< STATS_DATA_FORMAT(sizeToKB(heap_->GetNativeAreaAllocator()->GetRegExpNativeSize())) << "KB\n"
<< STATS_DESCRIPTION_FORMAT("ChunkNativeSize:")
<< STATS_DATA_FORMAT(sizeToKB(heap_->GetNativeAreaAllocator()->GetChunkNativeSize())) << "KB";
switch (gcType_) {
case GCType::STW_YOUNG_GC: {
double copiedRate = double(GetRecordData(RecordData::SEMI_ALIVE_SIZE)) /

View File

@ -25,6 +25,13 @@
#include "ecmascript/mem/area.h"
namespace panda::ecmascript {
enum class NativeFlag {
NO_DIV,
ARRAY_BUFFER,
REGEXP_BTYECODE,
CHUNK_MEM,
};
class PUBLIC_API NativeAreaAllocator {
public:
NativeAreaAllocator() = default;
@ -102,6 +109,69 @@ public:
return maxNativeMemoryUsage_.load(std::memory_order_relaxed);
}
size_t GetArrayBufferNativeSize() const
{
return arrayBufferNativeSize_;
}
size_t GetRegExpNativeSize() const
{
return regExpNativeSize_;
}
size_t GetChunkNativeSize() const
{
return chunkNativeSize_;
}
inline void IncreaseNativeSizeStats(size_t size, NativeFlag flag)
{
if (size == 0) {
return;
}
switch (flag) {
case NativeFlag::ARRAY_BUFFER:
arrayBufferNativeSize_ += size;
break;
case NativeFlag::REGEXP_BTYECODE:
regExpNativeSize_ += size;
break;
case NativeFlag::CHUNK_MEM:
chunkNativeSize_ += size;
break;
default:
break;
}
}
inline void DecreaseNativeSizeStats(size_t size, NativeFlag flag)
{
if (size == 0) {
return;
}
switch (flag) {
case NativeFlag::ARRAY_BUFFER:
arrayBufferNativeSize_ -= size;
break;
case NativeFlag::REGEXP_BTYECODE:
regExpNativeSize_ -= size;
break;
case NativeFlag::CHUNK_MEM:
chunkNativeSize_ -= size;
break;
default:
break;
}
}
void ModifyNativeSizeStats(size_t preSize, size_t nextSize, NativeFlag flag) {
if (flag == NativeFlag::NO_DIV) {
return;
}
DecreaseNativeSizeStats(preSize, flag);
IncreaseNativeSizeStats(nextSize, flag);
}
void *Allocate(size_t size)
{
if (size == 0) {
@ -153,6 +223,10 @@ private:
Area *cachedArea_ {nullptr};
std::atomic<size_t> nativeMemoryUsage_ {0};
std::atomic<size_t> maxNativeMemoryUsage_ {0};
// native area size stats
size_t arrayBufferNativeSize_ {0};
size_t regExpNativeSize_ {0};
size_t chunkNativeSize_ {0};
};
} // namespace panda::ecmascript

View File

@ -73,7 +73,8 @@ JSHandle<JSNativePointer> ObjectFactory::NewJSNativePointer(void *externalPointe
const DeleteEntryPoint &callBack,
void *data,
bool nonMovable,
size_t nativeBindingsize)
size_t nativeBindingsize,
NativeFlag flag)
{
NewObjectHook();
TaggedObject *header;
@ -88,9 +89,12 @@ JSHandle<JSNativePointer> ObjectFactory::NewJSNativePointer(void *externalPointe
obj->SetDeleter(callBack);
obj->SetData(data);
obj->SetBindingSize(nativeBindingsize);
obj->SetNativeFlag(flag);
if (callBack != nullptr) {
heap_->IncreaseNativeBindingSize(nativeBindingsize);
if (flag == NativeFlag::NO_DIV) {
heap_->IncreaseNativeBindingSize(nativeBindingsize);
}
vm_->PushToNativePointerList(static_cast<JSNativePointer *>(header));
}
return obj;

View File

@ -242,6 +242,8 @@ void ObjectFactory::NewJSArrayBufferData(const JSHandle<JSArrayBuffer> &array, i
UNREACHABLE();
}
pointer->ResetExternalPointer(newData);
vm_->GetNativeAreaAllocator()->ModifyNativeSizeStats(pointer->GetBindingSize(), size,
NativeFlag::ARRAY_BUFFER);
return;
}
@ -251,9 +253,11 @@ void ObjectFactory::NewJSArrayBufferData(const JSHandle<JSArrayBuffer> &array, i
UNREACHABLE();
}
JSHandle<JSNativePointer> pointer = NewJSNativePointer(newData, NativeAreaAllocator::FreeBufferFunc,
vm_->GetNativeAreaAllocator(), false, size);
vm_->GetNativeAreaAllocator(), false, size,
NativeFlag::ARRAY_BUFFER);
array->SetArrayBufferData(thread_, pointer);
array->SetWithNativeAreaAllocator(true);
vm_->GetNativeAreaAllocator()->IncreaseNativeSizeStats(length, NativeFlag::ARRAY_BUFFER);
}
void ObjectFactory::NewJSSharedArrayBufferData(const JSHandle<JSArrayBuffer> &array, int32_t length)
@ -288,9 +292,11 @@ JSHandle<JSArrayBuffer> ObjectFactory::NewJSArrayBuffer(int32_t length)
UNREACHABLE();
}
JSHandle<JSNativePointer> pointer = NewJSNativePointer(newData, NativeAreaAllocator::FreeBufferFunc,
vm_->GetNativeAreaAllocator(), false, length);
vm_->GetNativeAreaAllocator(), false, length,
NativeFlag::ARRAY_BUFFER);
arrayBuffer->SetArrayBufferData(thread_, pointer.GetTaggedValue());
arrayBuffer->SetWithNativeAreaAllocator(true);
vm_->GetNativeAreaAllocator()->IncreaseNativeSizeStats(length, NativeFlag::ARRAY_BUFFER);
}
return arrayBuffer;
}
@ -382,9 +388,11 @@ void ObjectFactory::NewJSRegExpByteCodeData(const JSHandle<JSRegExp> &regexp, vo
return;
}
JSHandle<JSNativePointer> pointer = NewJSNativePointer(newBuffer, NativeAreaAllocator::FreeBufferFunc,
vm_->GetNativeAreaAllocator(), false, size);
vm_->GetNativeAreaAllocator(), false, size,
NativeFlag::REGEXP_BTYECODE);
regexp->SetByteCodeBuffer(thread_, pointer.GetTaggedValue());
regexp->SetLength(static_cast<uint32_t>(size));
vm_->GetNativeAreaAllocator()->IncreaseNativeSizeStats(size, NativeFlag::REGEXP_BTYECODE);
}
JSHandle<JSHClass> ObjectFactory::NewEcmaHClass(uint32_t size, JSType type, const JSHandle<JSTaggedValue> &prototype,

View File

@ -469,7 +469,8 @@ public:
const DeleteEntryPoint &callBack = nullptr,
void *data = nullptr,
bool nonMovable = false,
size_t nativeBindingsize = 0);
size_t nativeBindingsize = 0,
NativeFlag flag = NativeFlag::NO_DIV);
JSHandle<JSObject> NewOldSpaceObjLiteralByHClass(const JSHandle<TaggedArray> &properties, size_t length);
JSHandle<JSHClass> SetLayoutInObjHClass(const JSHandle<TaggedArray> &properties, size_t length,