diff options
author | 2023-07-29 06:18:51 -0700 | |
---|---|---|
committer | 2023-07-29 06:18:51 -0700 | |
commit | 681be10294c19b8ce402ec44df5cd6554e2c86c0 (patch) | |
tree | d7729f1c4b2cd6f2f9e9ad45002b8fa3f44ba8fe /src/bun.js/bindings/BunJSCModule.cpp | |
parent | dccf82b1c682a84c42540ba9e00e5e9296cc7e5f (diff) | |
download | bun-681be10294c19b8ce402ec44df5cd6554e2c86c0.tar.gz bun-681be10294c19b8ce402ec44df5cd6554e2c86c0.tar.zst bun-681be10294c19b8ce402ec44df5cd6554e2c86c0.zip |
Make `bun:jsc` memoryUsage more accurate (#3876)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/bindings/BunJSCModule.cpp')
-rw-r--r-- | src/bun.js/bindings/BunJSCModule.cpp | 105 |
1 files changed, 39 insertions, 66 deletions
diff --git a/src/bun.js/bindings/BunJSCModule.cpp b/src/bun.js/bindings/BunJSCModule.cpp index 5e7a047ea..444318632 100644 --- a/src/bun.js/bindings/BunJSCModule.cpp +++ b/src/bun.js/bindings/BunJSCModule.cpp @@ -28,6 +28,8 @@ #include "ExceptionOr.h" #include "MessagePort.h" +#include "Process.h" + #if ENABLE(REMOTE_INSPECTOR) #include "JavaScriptCore/RemoteInspectorServer.h" #endif @@ -146,73 +148,20 @@ JSC_DEFINE_HOST_FUNCTION(functionHeapSize, (JSGlobalObject * globalObject, CallF return JSValue::encode(jsNumber(vm.heap.size())); } -class JSCMemoryFootprint : public JSDestructibleObject { - using Base = JSDestructibleObject; - -public: - template<typename CellType, SubspaceAccess> - static CompleteSubspace* subspaceFor(VM& vm) - { - return &vm.destructibleObjectSpace(); - } - - JSCMemoryFootprint(VM& vm, Structure* structure) - : Base(vm, structure) - { - } - - static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); - } - - static JSCMemoryFootprint* create(VM& vm, JSGlobalObject* globalObject) - { - Structure* structure = createStructure(vm, globalObject, jsNull()); - JSCMemoryFootprint* footprint = new (NotNull, allocateCell<JSCMemoryFootprint>(vm)) JSCMemoryFootprint(vm, structure); - footprint->finishCreation(vm); - return footprint; - } - - void finishCreation(VM& vm) - { - Base::finishCreation(vm); - - auto addProperty = [&](VM& vm, ASCIILiteral name, JSValue value) { - JSCMemoryFootprint::addProperty(vm, name, value); - }; - - size_t elapsed_msecs = 0; - size_t user_msecs = 0; - size_t system_msecs = 0; - size_t current_rss = 0; - size_t peak_rss = 0; - size_t current_commit = 0; - size_t peak_commit = 0; - size_t page_faults = 0; - - mi_process_info(&elapsed_msecs, &user_msecs, &system_msecs, - ¤t_rss, &peak_rss, - ¤t_commit, &peak_commit, &page_faults); - - addProperty(vm, "current"_s, jsNumber(current_rss)); - addProperty(vm, "peak"_s, jsNumber(peak_rss)); - addProperty(vm, "currentCommit"_s, jsNumber(current_commit)); - addProperty(vm, "peakCommit"_s, jsNumber(peak_commit)); - addProperty(vm, "pageFaults"_s, jsNumber(page_faults)); - } +JSC::Structure* createMemoryFootprintStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject) +{ - DECLARE_INFO; + JSC::Structure* structure = globalObject->structureCache().emptyObjectStructureForPrototype(globalObject, globalObject->objectPrototype(), 5); + JSC::PropertyOffset offset; -private: - void addProperty(VM& vm, ASCIILiteral name, JSValue value) - { - Identifier identifier = Identifier::fromString(vm, name); - putDirect(vm, identifier, value); - } -}; + structure = structure->addPropertyTransition(vm, structure, Identifier::fromString(vm, "current"_s), 0, offset); + structure = structure->addPropertyTransition(vm, structure, Identifier::fromString(vm, "peak"_s), 0, offset); + structure = structure->addPropertyTransition(vm, structure, Identifier::fromString(vm, "currentCommit"_s), 0, offset); + structure = structure->addPropertyTransition(vm, structure, Identifier::fromString(vm, "peakCommit"_s), 0, offset); + structure = structure->addPropertyTransition(vm, structure, Identifier::fromString(vm, "pageFaults"_s), 0, offset); -const ClassInfo JSCMemoryFootprint::s_info = { "MemoryFootprint"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSCMemoryFootprint) }; + return structure; +} JSC_DECLARE_HOST_FUNCTION(functionMemoryUsageStatistics); JSC_DEFINE_HOST_FUNCTION(functionMemoryUsageStatistics, (JSGlobalObject * globalObject, CallFrame*)) @@ -245,9 +194,33 @@ JSC_DEFINE_HOST_FUNCTION(functionMemoryUsageStatistics, (JSGlobalObject * global JSC_DECLARE_HOST_FUNCTION(functionCreateMemoryFootprint); JSC_DEFINE_HOST_FUNCTION(functionCreateMemoryFootprint, (JSGlobalObject * globalObject, CallFrame*)) { + + size_t elapsed_msecs = 0; + size_t user_msecs = 0; + size_t system_msecs = 0; + size_t current_rss = 0; + size_t peak_rss = 0; + size_t current_commit = 0; + size_t peak_commit = 0; + size_t page_faults = 0; + + mi_process_info(&elapsed_msecs, &user_msecs, &system_msecs, + ¤t_rss, &peak_rss, + ¤t_commit, &peak_commit, &page_faults); + + // mi_process_info produces incorrect rss size on linux. + Zig::getRSS(¤t_rss); + VM& vm = globalObject->vm(); - JSLockHolder lock(vm); - return JSValue::encode(JSCMemoryFootprint::create(vm, globalObject)); + JSC::JSObject* object = JSC::constructEmptyObject(vm, JSC::jsCast<Zig::GlobalObject*>(globalObject)->memoryFootprintStructure()); + + object->putDirectOffset(vm, 0, jsNumber(current_rss)); + object->putDirectOffset(vm, 1, jsNumber(peak_rss)); + object->putDirectOffset(vm, 2, jsNumber(current_commit)); + object->putDirectOffset(vm, 3, jsNumber(peak_commit)); + object->putDirectOffset(vm, 4, jsNumber(page_faults)); + + return JSValue::encode(object); } JSC_DECLARE_HOST_FUNCTION(functionNeverInlineFunction); |