2016-03-28 14 views
1

永続的な処分します。が正しく、私は非常に単純なコードを持って<ArrayBuffer>

カウンタがあるので、作成したPersistenceのストレージごとにsetWeakFunctionが呼び出されます。浮動小数点数が10000未満の場合、永続化された各セルが呼び出されます。しかし浮動小数点のサイズが100 000になると、1Gbのメモリが消費されるまでオブジェクトを破棄しようとはしません。

ガベージコレクタはオブジェクトの束に対してWeakCallbackを一度呼びますが、これを確認して情報を見つけられませんでした。

さらに悪いことに、1000 000浮動小数点配列のガベージコレクションコールは見たことがありませんでした。

この配列を正しく廃棄するにはどうすればよいですか?

+0

それは厄介なコードのように見えます。 C++にはガベージコレクションはなく、必要もありません。 –

+0

@RichardHodges、あなたは 'v8'と' arraybuffer'タグについて触れましたか? –

答えて

0

は私は上記のコードを修正してみましょう:

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) 
関連する問題