首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确配置Persistent<ArrayBuffer>

正确配置Persistent<ArrayBuffer>
EN

Stack Overflow用户
提问于 2016-03-28 22:20:17
回答 1查看 412关注 0票数 1

我得到了非常简单的代码:

代码语言:javascript
运行
复制
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)

这段代码在某种程度上对我来说很尴尬。

因为我希望有一个计数器,所以我创建每个Persistence存储都会调用setWeakFunction。当浮点数小于10000时,它会调用每个持久单元格。但是当浮点数的大小变为100 000时,它不会尝试处理任何对象,直到有1 1Gb的内存被占用,然后它不断地删除,但只剩下2-3个对象。

我有一个想法,垃圾收集器为一堆对象调用WeakCallback一次,但没有找到信息,证实了这一点。

更糟糕的是,我从未见过任何对1000 000浮点数组的垃圾回收调用。

如何正确处理这些数组?

EN

回答 1

Stack Overflow用户

发布于 2017-02-06 22:46:23

让我试着修复上面的代码:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36264254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档