10

Nodejs バージョン: 0.8.8

サーバーは次のとおりです。

var http = require('http');
var port = 1338;
var ip = "127.0.0.1";    

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hi there\n');
}).listen(port, ip);    

クライアント (php スクリプト) は、上記のサーバーへのポスト リクエストを返します。POST は文字列 (json) で、サイズは約 4 メガバイトです。

ご覧のとおり、サーバーは投稿されたデータに対して何もしません。デバッグするために、すべてのコードを削除し、何もしない hello world の例に戻りました :)
ノード プロセスのメモリ使用量を確認すると (アクティビティ モニター、Mac アプリで実行)、ノードサーバーのメモリ使用量は、リクエストごとに大きくなっています。
そのため、20 回ほどのリクエストの後、メモリ使用量は 2 倍になります。

4

1 に答える 1

21

これはバグではありません。これは正常で、予期される動作です。

Node.js は、ガベージ コレクション言語である JavaScript に基づいています。つまり、メモリがすぐに解放されるのではなく、メモリが解放されるまでに時間がかかります (たとえば、ガベージが収集されます)。V8 (ノードが使用する) には、実際には、 「高速なオブジェクト割り当て、短いガベージ コレクションの一時停止、およびメモリの断片化がないことを保証する」非常にインテリジェントなガベージ コレクターがあります。

この動作を説明するために、Windows で node.js 0.8.8 を使用して上記のスクリプトを実行し、大量の HTTP POST 要求でサーバーを攻撃しました。

Process Explorer には、次のメモリ使用量グラフが表示されます。

ここに画像の説明を入力

ご覧のとおり、ガベージ コレクションをトリガーする特定の制限まで、メモリ使用量が増加します。クリーンアップ後、使用量はリセットされ、次のトリガーまで再び上昇を開始します。

于 2012-10-16T14:59:41.803 に答える