メモリ

このドキュメントでは、メモリ関連の問題のデバッグ方法について学習できます。

私のプロセスはメモリ不足になります

Node.js (JavaScript) はガベージコレクション言語であるため、リテーナーを介してメモリリークが発生する可能性があります。Node.js アプリケーションは通常、マルチテナント、ビジネスクリティカル、そして長時間実行されるため、メモリリークを見つけるためのアクセスしやすく効率的な方法を提供することが不可欠です。

症状

ユーザーは、メモリ使用量が継続的に増加する(数日または数週間で高速または低速になる可能性があります)ことを観察し、その後、プロセスがクラッシュしてプロセスマネージャーによって再起動されるのを目にします。プロセスは以前よりも遅くなっている可能性があり、再起動により一部のリクエストが失敗する可能性があります(ロードバランサーが 502 で応答します)。

副作用

  • メモリ枯渇によるプロセスの再起動と、リクエストがドロップされる
  • GC アクティビティの増加により、CPU 使用率が高くなり、応答時間が遅くなる
    • GC がイベントループをブロックして遅延を引き起こす
  • メモリのスワップの増加により、プロセスの速度が低下する(GC アクティビティ)
  • ヒープスナップショットを取得するための利用可能なメモリが不足している可能性がある

私のプロセスはメモリを非効率的に使用しています

症状

アプリケーションは予期しない量のメモリを使用しているか、またはガベージコレクターのアクティビティが上昇していることが観察されます。

副作用

  • ページフォルト数の増加
  • GC アクティビティと CPU 使用率の上昇

デバッグ

ほとんどのメモリ問題は、特定の種類のオブジェクトがどのくらいのスペースを占めるか、そしてどの変数がそれらのガベージコレクションを妨げているかを特定することで解決できます。プログラムの時間の経過に伴う割り当てパターンを知ることも役立ちます。