1

私が取り組んでいるアプリケーションは、スクリプト用にV8を埋め込みます。メモリを節約するために、スクリプトコンポーネントが不要になったときにシャットダウンしたいのですが、何らかの理由でメモリがOSに戻されません。

これが私が試したことです:

1.永続コンテキストハンドルでDispose()を呼び出します

context.Dispose();

2.ガベージコレクションを強制します

while (!v8::V8::IdleNotification());

そのいずれも、プロセスのメモリ使用量に顕著な影響はありません。スクリプトがメモリを要求したときにどのように上昇するかははっきりとわかりますが、二度と下降することはありません。

でプロセスメモリ使用量を決定していps -o rssます。プロセスが使用しているメモリの量を把握することは、プロファイラーなしでは実際には不可能であることを私は知っていますが、V8がメモリを解放するときにrssを停止する必要があると思います。

4

2 に答える 2

0

アプリケーションがメモリを正しく解放した場合でも、OSがメモリを再利用していない可能性があります(パフォーマンス上の理由など)。アプリケーションヒープは、すぐに必要になった場合に備えて、メモリを保持している場合もあります。いずれにせよ、リークしていないことが確実であれば(valgrindのようなものを試してみてください)、私はそれについて心配しません。

于 2013-03-08T13:05:30.510 に答える
0

これと格闘するのに数時間を費やしただけで、最終的にはV8のapi.ccを掘り下げる必要がありました。

高速再利用のためのグローバルオブジェクトテンプレートの最後のインスタンス(生のObjectTemplateまたはプロキシ用のFunctionTemplateから派生したもの)のV8ピンが判明しました。これは、GCフラッシュを強制しようとすると非常に混乱します。回避策は、新しいダミーコンテキストを割り当てることです(フラッシュしようとしているコンテキストと同じテンプレートを使用します)。

static void do_gc()
{
  {
    Isolate *i = Isolate::GetCurrent();
    HandleScope h(i);
    Handle<Context> c = Context::New(i); // Default contexes
    Handle<Context> c = Context::New(i, 0, objtemplate); // With custom object
    Handle<Context> c = Context::New(i, 0, fntemplate->InstanceTemplate()); // With proxy
  }
  while (!v8::V8::IdleNotification());
}

コンテキストでの使用法を確認するにはhttps://github.com/katlogic/lv8/blob/344353dac702901c917a4c05438252121c527ab3/lv8.cpp#L755

于 2014-05-03T04:21:14.313 に答える