-
-
Notifications
You must be signed in to change notification settings - Fork 487
Closed
Description
Memory leak(s)
To reproduce
https://github.com/nodejs/node-addon-examples/tree/master/napi-asyncworker-example/node-addon-api
then following script (MemoryLeak.js)
const runWorker = require('../build/Debug/napi-asyncworker-example-native');
function MemoryLeak(i, count) {
if (i == count) return;
let result = runWorker.runSimpleAsyncWorker(1, (err, result) => {
if (err) {
console.log("SimpleAsyncWorker returned an error: ", err);
} else {
if (i == count - 1) {
//global.gc();
//console.log(process.memoryUsage());
//console.log(require('v8').getHeapStatistics());
//console.log(require('v8').getHeapSpaceStatistics());
}
console.log("SimpleAsyncWorker returned '"+result+"'.");
}
});
console.log("runSimpleAsyncWorker returned '"+result+"'.");
MemoryLeak(++i, count);
}
//console.log(process.memoryUsage());
//console.log(require('v8').getHeapStatistics());
//console.log(require('v8').getHeapSpaceStatistics());
let i = 0;
MemoryLeak(i, 5);
node-v10.23.0 + node-addon-api-v3.0.2
valgrind --leak-check=yes /opt/node-v10.23.0/bin/node test/MemoryLeak.js
==222152== 224 bytes in 4 blocks are definitely lost in loss record 35 of 41
==222152== at 0x483BE63: operator new(unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==222152== by 0x75CFD9: napi_create_reference (in /opt/node-v10.23.0/bin/node)
==222152== by 0x4863057: Napi::Reference<Napi::Function>::New(Napi::Function const&, unsigned int) (napi-inl.h:2153)
==222152== by 0x4862292: Napi::Persistent(Napi::Function) (napi-inl.h:2317)
==222152== by 0x4862683: Napi::AsyncWorker::AsyncWorker(Napi::Object const&, Napi::Function const&, char const*, Napi::Object const&) (napi-inl.h:3588)
==222152== by 0x48625C1: Napi::AsyncWorker::AsyncWorker(Napi::Function const&, char const*, Napi::Object const&) (napi-inl.h:3564)
==222152== by 0x4862534: Napi::AsyncWorker::AsyncWorker(Napi::Function const&, char const*) (napi-inl.h:3555)
==222152== by 0x48624C5: Napi::AsyncWorker::AsyncWorker(Napi::Function const&) (napi-inl.h:3550)
==222152== by 0x4861AA3: SimpleAsyncWorker::SimpleAsyncWorker(Napi::Function&, int) (SimpleAsyncWorker.cc:6)
==222152== by 0x485E09A: runSimpleAsyncWorker(Napi::CallbackInfo const&) (RunSimpleAsyncWorker.cc:6)
==222152== by 0x486139D: Napi::details::CallbackData<Napi::Value (*)(Napi::CallbackInfo const&), Napi::Value>::Wrapper(napi_env__*, napi_callback_info__*)::{lambda()#1}::operator()() const (napi-inl.h:82)
==222152== by 0x4861753: napi_value__* Napi::details::WrapCallback<Napi::details::CallbackData<Napi::Value (*)(Napi::CallbackInfo const&), Napi::Value>::Wrapper(napi_env__*, napi_callback_info__*)::{lambda()#1}>(Napi::details::CallbackData<Napi::Value (*)(Napi::CallbackInfo const&), Napi::Value>::Wrapper(napi_env__*, napi_callback_info__*)::{lambda()#1}) (napi-inl.h:61)
looks interesting ^
==222152== LEAK SUMMARY:
==222152== definitely lost: 544 bytes in 10 blocks
==222152== indirectly lost: 16 bytes in 1 blocks
==222152== possibly lost: 304 bytes in 1 blocks
==222152== still reachable: 72,075 bytes in 1,076 blocks
==222152== suppressed: 0 bytes in 0 blocks
Amount of definitely lost increases as number of iterations increases e.g calling MemoryLeak(i, 100) ^^
node-v14.11.0 + node-addon-api-v3.0.2
valgrind --leak-check=yes /opt/node-v14.11.0/bin/node test/MemoryLeak.js
==222253== LEAK SUMMARY:
==222253== definitely lost: 64 bytes in 1 blocks
==222253== indirectly lost: 0 bytes in 0 blocks
==222253== possibly lost: 304 bytes in 1 blocks
==222253== still reachable: 8,191 bytes in 30 blocks
==222253== of which reachable via heuristic:
==222253== multipleinheritance: 48 bytes in 1 blocks
==222253== suppressed: 0 bytes in 0 blocks
With node >=13 (tested with node-v13.12.0 and node-v14.11.0) there are constant results from memcheck no matter how many iterations as above.
It looks like there are memory leaks related to node-addon-api in node-10 and/or corresponding napi implementation ( and also in node-v12.16.1)
Is this known behaviour? Did anyone came across similar issues?
Metadata
Metadata
Assignees
Labels
No labels