Правильно утилизировать Persistent & lt; ArrayBuffer & gt;

Я получил очень простой код:

struct Dyn {
float *ptr;
int n;
};void setWeakFunction1(const WeakCallbackInfo<Dyn> &data) {
}
void setWeakFunction(const WeakCallbackInfo<Dyn> &data) {
auto *v = data.GetParameter();
data.SetSecondPassCallback(setWeakFunction1);
std::cout << v->n << " Collector\n";
delete[] v->ptr;
delete v;

}

void getIndex(const FunctionCallbackInfo<Value> &args) {
Dyn *d = new Dyn;
float *ptr = new float[amount];
for (size_t i = 0; i < amount; ++i) {
ptr[i] = i + 2;
}

auto isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Local<ArrayBuffer> ab =
ArrayBuffer::New(isolate, ptr, amount * sizeof(float));
Persistent<ArrayBuffer> pab(isolate, ab);
pab.SetWeak(d, setWeakFunction, WeakCallbackType::kInternalFields);
pab.MarkIndependent();
args.GetReturnValue().Set(ab);
}

void RegisterModule(Local<Object> exports, Local<Object>) {
auto isolate = Isolate::GetCurrent();
exports->Set(String::NewFromUtf8(isolate, "getIndex"),
FunctionTemplate::New(isolate, getIndex)->GetFunction());
}

NODE_MODULE(commander, RegisterModule)

Этот код работает как-то неловко для меня.

Так как есть счетчик, я ожидаю, что setWeakFunction призван для каждого Persistence хранилище я создал. Когда количество чисел с плавающей точкой меньше 10000, оно запрашивает каждую постоянную ячейку. Но когда размеры поплавков становятся 100 000, он не пытается избавиться ни от одного из объектов, пока не будет съедено 1 ГБ памяти, затем он удаляется постоянно, но остается 2-3 объекта.

У меня была мысль, что звонит сборщик мусора WeakCallback один раз за кучу предметов, но не нашел информации, подтверждающей это.

Хуже того, я никогда не видел призывов к сбору мусора. 1000 000 массивы с плавающей точкой.

Как правильно расположить эти массивы?

1

Решение

Позвольте мне попытаться исправить приведенный выше код:

struct Dyn {
Persistent<ArrayBuffer> pab;
float *ptr;
int n;
};

void setWeakFunction(const WeakCallbackInfo<Dyn> &data) {
auto *v = data.GetParameter();
std::cout << v->n << " Collector\n";
v->pab.Reset();
delete[] v->ptr;
delete v;

}

void getIndex(const FunctionCallbackInfo<Value> &args) {
Dyn *d = new Dyn;
float *ptr = new float[amount];
for (size_t i = 0; i < amount; ++i) {
ptr[i] = i + 2;
}

auto isolate = args.GetIsolate();
HandleScope scope(isolate);
Local<ArrayBuffer> ab =
ArrayBuffer::New(isolate, ptr, amount * sizeof(float), ArrayBufferCreationMode::kExternalized);
d->pab.Reset(isolate, ab);
d->pab.SetWeak(d, setWeakFunction, WeakCallbackType::kParameter);
d->pab.MarkIndependent();
args.GetReturnValue().Set(ab);
}

void RegisterModule(Local<Object> exports, Local<Object>) {
auto isolate = Isolate::GetCurrent();
exports->Set(String::NewFromUtf8(isolate, "getIndex"),
FunctionTemplate::New(isolate, getIndex)->GetFunction());
}

NODE_MODULE(commander, RegisterModule)
0

Другие решения

Других решений пока нет …