36

nodejsのメモリリークを検出するためのツールはありますか?そして、nodejsアプリケーションのテストの経験について教えてください。

4

7 に答える 7

23

次のツールは、メモリリークを見つけるのに役立ちます。

ノードインスペクター

また、ここにメモリリークを見つけるのに役立つチュートリアルもあります。

https://github.com/felixge/node-memory-leak-tutorial

于 2012-05-14T08:46:49.657 に答える
10

メモリリークを追跡する際に、上記のノードインスペクターを試しました。
2012年4月の時点では、最新のノードリリースv0.6.12で動作するように更新されていません。そのため、https ://github.com/c4milo/node-webkit-agentを見つけました。
node-inspectorでサポートされていない新しいV8エンジンのヒープスナップショットを表示することができました。短い順序で、リークしているモジュールを検出できました(場合によってはログに記録されます)。同様の成功を収めることを願っています。

于 2012-05-15T16:01:18.400 に答える
6

次の情報源もお勧めします。

  1. NodeUpの次のエピソードでは、プロファイリングとメモリリークの検出ツールについて説明します。

  2. この記事-Node.jsでのメモリリークの追跡– Node.JSホリデーシーズン。基本的に、広く知られているすべてのモジュールと手法を集約して、メモリリークを追跡します。

  3. Mac OSの場合-Instrumentsツールは、ネイティブ(C ++)モジュールのデバッグに役立つ場合があります。SmartOSツールほど洗練されていませんが、セットアップは非常に簡単です。
于 2013-05-31T11:55:47.577 に答える
5

方法1-
ノードを使用すると、ガベージコレクションを手動でトリガーできます。これは、メモリリークを確認するときに最初に行う必要があることです。これは、-expose-gcフラグを指定してNodeを実行することで実現できます(つまり、node --expose-gc index.js)。ノードがそのモードで実行されると、プログラムからglobal.gc()を呼び出すことにより、いつでもプログラムでガベージコレクションをトリガーできます。

process.memoryUsage()。heapUsedを呼び出すことにより、プロセスで使用されているメモリの量を確認することもできます。

ガベージコレクションを手動でトリガーし、使用されているヒープを確認することで、プログラムのメモリリークを実際に観察しているかどうかを判断できます。このテストを行うと、メモリの増加がさらに明らかになります。

方法2-

3ヒープダンプ方式

ノードの--inspectフラグがノードバージョン6に追加されました。この機能を使用すると、ChromeのDevTools内からノードプロセスをデバッグおよび検査できます。

--inspectフラグを渡してアプリケーションを起動するだけです。

$ node --inspect index.js

インスペクターのURLをたどり、[メモリ]タブに移動します。

DevToolsの[メモリ]タブ

ここに画像の説明を入力してください これが私たちがすることです:

autocannon -c 1 -d 60 http:// localhost:PORT
[ https://www.npmjs.com/package/autocannon ]でアプリケーションをヒットします
。約10秒後、および30秒後にヒープスナップショットを取得します。

ヒープスナップショット
の比較比較ビューには、スナップショット間で何が起こったかが表示されます。膨大な数のオブジェクトが作成されたか、GCによって収集されていないことがわかります。

詳細については、これらのすばらしい記事をお読みください。
彼らはリークを見つけて修正するのに大いに役立ちました:-

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

https://www.nearform.com/blog/self-detect-memory-leak-node/

https://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/

于 2017-09-17T00:00:26.730 に答える
2

node-inspectorやnode-webkit-agentではなく、Chrome開発ツールとheapsnapshotファイルを直接使用しています。

require()ヒープダンプモジュール。

実行中のnodejsプロセスにusr2シグナルを送信して、heapsnapshotファイルを取得します。

Chrome開発ツールの[プロファイル]タブにheapsnapshotファイルをロードします。

于 2014-05-23T03:13:33.740 に答える
1

私はnpmパッケージMemwatchを使用しました:

GithubリポジトリNPMソースを見てください

基本的に、このパッケージは、V8エンジンによってガベージコレクションが実行された直後にメモリヒープ使用量をチェックし、実際のメモリ使用量のベースラインを提供します。

これが私がそれをどのように使用したかです:

var memwatch = require('memwatch');

memwatch.on('leak', function(info) {
    console.log('Memwatch leak: ');
    console.log(info);
});

memwatch.on('stats', function(stats) {
    console.log.message('Memwatch stats: ');
    console.log(stats);
});

元のドキュメントから:

時折発生するこの'stats'イベントは、ヒープの使用状況と時間の経過に伴う傾向を説明するデータを提供します。

この'leak'イベントは、コードがメモリリークしているように見えるときに発行されます。通常、ヒープサイズが短時間で継続的に大きくなる場合に実行されます。

Memwatchには、関数で取得できる2つのスナップショット間のヒープ状態を計算するための「HeapDiff」クラスも用意されています。

問題の原因となっているイベントを追跡するために、ステージ環境でmemwatchを実行することをお勧めします。

于 2015-06-15T13:36:02.767 に答える
0

https://github.com/bnoordhuis/node-heapdumpは 非常にシンプルで、Chromeで結果を表示し(ブラウザーのjavascriptとnodejsで同じV8エンジンを使用しているため)、必要なときにメモリ内のオブジェクトサイズを比較できます。

そして、メモリリークを「手動で」検出する方法、またはそれを防ぐのに役立つもう1つのヒントは、コードの一部の場所でガベージコレクターを強制し、何が起こるかを確認することです。

「node--expose-gcfile.js」でアプリケーションを起動し、コード内の任意の場所で関数gc();を使用できます。ガベージコレクションを呼び出します。

于 2015-06-08T16:42:58.283 に答える