JavaScript のメモリや GC を扱った記事のメモ

JavaScript のメモリ や GC を意識したプログラミングに関する記事をふたつばかり読んだので、個人用のメモ。

www.html5rocks.com

  • V8 が minor GC を実行するときは 10ms オーダーの時間がかかる。
  • 60fps を実現する場合の 1フレームは 16ms であるから、GC が頻発すると全体の fps が低下し、表示のかくつきや操作の違和感に繋がる。
  • GC が発生するのは大量のオブジェクトの生成・破棄を繰り返したときだから、事前にオブジェクトを生成しておいてそれを使い回せばいい。(オブジェクトプール)
  • 万能ではない。初期化に時間がかかるし、大してオブジェクトを作らない場合でもメモリを無駄に使用することになる。また、その無駄なメモリを解放するタイミングが難しい。
  • ( モバイルの場合は、大量のメモリの使用がバッテリーの著しい消費に繋がるから、滑らかな UI を実現することとのトレードオフな気がする )
  • (どこで聞いたか忘れたけども、React は生成したインスタンスをプールするutil関数を定義している react/PooledClass.js at 19b8eadb242054e2668cf90e83490ef552bcdbfe · facebook/react · GitHub )
  • ( 話がズレるが、↑のコードで引数の個数毎に関数を定義しているのは apply よりも call のほうがパフォーマンスが良いため )

www.html5rocks.com

  • V8 の GC の説明。世代別 GC、minor GCアルゴリズムはコピー GC で、major GCアルゴリズムはマークコンパクト GC
  • Gmail のパフォーマンス改善のために performance.memory API で情報の収集をおこなった。
  • Chrome DevTools でメモリリークの原因を特定できる。
  • 先の記事と同様で、GC の頻発は避けましょう。
  • ( ページを何日も開き続けるサービスに関わったことがないのだけど、1~2時間開き続けるサービスは心当たりがあるので、メモリの使用量を調べてみるとよさそう )