node.js-requireエラーはメモリリークを引き起こしますか?

PKK

私はそのヒープを継続的に成長させる次のプログラムを持っています。これは、SyntaxErrorを介して外部ファイル(を繰り返しロードする非常に単純なプログラムrequireです。外部モジュールは、構文エラーのためにロードに失敗します。

ノードのガベージコレクターを実行し、ヒープサイズをダンプして、メモリがリークしていないかどうかを確認します。外部ファイル(SyntaxError.jsの構文エラーを修正すると、リークはなくなり、メモリ使用量は100万回の反復後も一定に保たれます。

ノードバージョンの使用:0.10.29と --expose-gc

何が起こっているのか、そしてどうすればmemリークを回避できるのかについての洞察をいただければ幸いです。

テストコード:

(function() {
  var MAX_ITER_COUNT, MEGABYTE, dumpMem, gc, iterCount, noop, peakMem, test2;

  iterCount = 0;

  MAX_ITER_COUNT = 1000 * 1000;

  peakMem = 0;

  MEGABYTE = 1024 * 1024;

  noop = function() {};

  dumpMem = function() {
    var currentMem;
    currentMem = Math.round(process.memoryUsage().heapUsed / MEGABYTE);
    if (currentMem > peakMem) {
      peakMem = currentMem;
    }
    return console.log("" + iterCount + " - memory is: " + currentMem + "/" + peakMem + " MB");
  };

  gc = function() {
    return global.gc();
  };

  process.on("uncaughtException", function(err) {
    return console.log("Unhandled exception! ", err, err.stack);
  });

  test2 = function() {
    var e;
    iterCount++;
    try {
      /*
      Load a module that has a syntax error to create mem leak, and ignore exception
      */

      require("./SyntaxError");
    } catch (_error) {
      e = _error;
    }
    gc();
    dumpMem();
    return setTimeout(test2, 0);
  };

  test2();

}).call(this);

そしてSyntaxError.js:

(function() {
  'use strict';
  /* y does not exist, and results in exception*/

  var x;

  x = y;

}).call(this);
アンドラス

これはノードのバグのようです。SyntaxError.js内のSyntaxError.jsの本体の周りにtry / catchを配置することで、これを回避できます。上記から簡略化した私のテスト:

mem-leak-bug.js:

for (i=0; i<1000000; i++) {
    try {
        require('./mem-leak--error.js');
    }
    catch (e) { }

    if (i % 1000 === 0) {
        global.gc();
        console.log(i, process.memoryUsage().heapUsed/1e6|0, process.memoryUsage().heapTotal/1e6|0);
    }
}

mem-leak--error.js:
注:catchブロックには明示的なリターン必要です。そうない場合、これもメモリリークになります。

// throw an undefined variable exception
try {
    return x;
}
catch(e) {
    return;
}

try-catchがないと、メモリリークが発生します。

% node --expose-gc ar/mem-leak-bug.js
0 1 5
1000 2 14
2000 2 14
3000 3 14
4000 3 23
5000 3 23
6000 4 24

SytaxError内のtry-catchでは、次のことは行われません。

% node --expose-gc ar/mem-leak-bug.js
0 1 5
1000 1 7
2000 1 7
3000 1 7
4000 1 7
5000 1 7
6000 1 7
7000 1 7
8000 1 7

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

node.js-requireエラーはメモリリークを引き起こしますか?

分類Dev

このクロージャはNode.jsでメモリリークを引き起こしますか、それとも悪いプログラミングですか?

分類Dev

角度とjqueryを持つrequire.jsはスクリプトエラーを引き起こします

分類Dev

Angular.js-このディレクティブはメモリリークを引き起こしますか?

分類Dev

Node.jsはどのようにスクリプトをメモリにロードしますか?

分類Dev

Node.jsのパラメーターを削除してから、リクエストに追加します

分類Dev

Next.jsリンクの先読みは本番環境で404エラーを引き起こします

分類Dev

Node.jsのExpress.jsにメモリリークがありますか?

分類Dev

クラスターモードでpm2を使用してnode.jsアプリを起動するにはどうすればよいですか?

分類Dev

node.jsとリクエストでリモートイメージを保存できません

分類Dev

Node.jsのパラメーターを使用してhttpgetリクエストを送信します

分類Dev

Gastby-gastby-node.jsのパラメーターを使用してGraphQLクエリを追加します

分類Dev

Node.jsのメモリリーク?

分類Dev

Node.jsのメモリリーク?

分類Dev

Node.jsまたは別のJSサーバー技術は、シリアル化なしでリクエスト間のネイティブ共有メモリをサポートしていますか?

分類Dev

node.jsはビューからmysqlデータベースにクエリを実行できますか?

分類Dev

UbuntuはNode.jsサーバーを起動し、Chromeをキオスクモードで開きます

分類Dev

Node js Swagger.jsonでクエリパラメータを渡す方法は?

分類Dev

$ emitがメモリリークを引き起こす-Vue.js

分類Dev

単純なCosmosDBクエリをNode.js経由で機能させることはできませんが、Azureのクエリエクスプローラー経由では正常に機能します

分類Dev

Node.js / MySQL:node.jsのエラーログに実際のクエリを出力します

分類Dev

node.jsでリクエストを検証し、エラーが発生した場合は終了します

分類Dev

Node.jsの「リクエスト」ライブラリは非同期反復可能な応答ストリームをサポートしていますか?

分類Dev

OpenShift node.jsエラー:EACCESをリッスンします

分類Dev

Node.js Cassandraドライバーを使用して、連続したクエリでスクリプトを実行できますか?

分類Dev

node.jsはいくつの同時データベースクエリを実行できますか?

分類Dev

node.jsで(htmlまたはユーザークライアントからの)リクエストタイプを検出できますか?

分類Dev

node js azure SDKgetBlobToStreamは大量のメモリを使用します

分類Dev

node.jsは「net」サーバーからhttpリクエストを転送して表現します

Related 関連記事

  1. 1

    node.js-requireエラーはメモリリークを引き起こしますか?

  2. 2

    このクロージャはNode.jsでメモリリークを引き起こしますか、それとも悪いプログラミングですか?

  3. 3

    角度とjqueryを持つrequire.jsはスクリプトエラーを引き起こします

  4. 4

    Angular.js-このディレクティブはメモリリークを引き起こしますか?

  5. 5

    Node.jsはどのようにスクリプトをメモリにロードしますか?

  6. 6

    Node.jsのパラメーターを削除してから、リクエストに追加します

  7. 7

    Next.jsリンクの先読みは本番環境で404エラーを引き起こします

  8. 8

    Node.jsのExpress.jsにメモリリークがありますか?

  9. 9

    クラスターモードでpm2を使用してnode.jsアプリを起動するにはどうすればよいですか?

  10. 10

    node.jsとリクエストでリモートイメージを保存できません

  11. 11

    Node.jsのパラメーターを使用してhttpgetリクエストを送信します

  12. 12

    Gastby-gastby-node.jsのパラメーターを使用してGraphQLクエリを追加します

  13. 13

    Node.jsのメモリリーク?

  14. 14

    Node.jsのメモリリーク?

  15. 15

    Node.jsまたは別のJSサーバー技術は、シリアル化なしでリクエスト間のネイティブ共有メモリをサポートしていますか?

  16. 16

    node.jsはビューからmysqlデータベースにクエリを実行できますか?

  17. 17

    UbuntuはNode.jsサーバーを起動し、Chromeをキオスクモードで開きます

  18. 18

    Node js Swagger.jsonでクエリパラメータを渡す方法は?

  19. 19

    $ emitがメモリリークを引き起こす-Vue.js

  20. 20

    単純なCosmosDBクエリをNode.js経由で機能させることはできませんが、Azureのクエリエクスプローラー経由では正常に機能します

  21. 21

    Node.js / MySQL:node.jsのエラーログに実際のクエリを出力します

  22. 22

    node.jsでリクエストを検証し、エラーが発生した場合は終了します

  23. 23

    Node.jsの「リクエスト」ライブラリは非同期反復可能な応答ストリームをサポートしていますか?

  24. 24

    OpenShift node.jsエラー:EACCESをリッスンします

  25. 25

    Node.js Cassandraドライバーを使用して、連続したクエリでスクリプトを実行できますか?

  26. 26

    node.jsはいくつの同時データベースクエリを実行できますか?

  27. 27

    node.jsで(htmlまたはユーザークライアントからの)リクエストタイプを検出できますか?

  28. 28

    node js azure SDKgetBlobToStreamは大量のメモリを使用します

  29. 29

    node.jsは「net」サーバーからhttpリクエストを転送して表現します

ホットタグ

アーカイブ