1秒あたり60回呼び出されるメインループを持つ、かなり複雑なJavaScriptアプリがあります。多くのガベージコレクションが行われているようです(Chrome開発ツールのメモリタイムラインからの「ノコギリ波」出力に基づく)。これは、アプリケーションのパフォーマンスに影響を与えることがよくあります。
そこで、ガベージコレクターが行う必要のある作業量を削減するためのベストプラクティスを調査しようとしています。(私がWebで見つけた情報のほとんどは、メモリリークを回避することを考慮しています。これは少し異なる質問です。メモリが解放されます。ガベージコレクションが多すぎるというだけです。)これは主にオブジェクトを可能な限り再利用することに帰着しますが、もちろん悪魔は詳細にあります。
アプリは、John ResigのSimple JavaScript Inheritanceに沿って「クラス」で構成されています。
1つの問題は、一部の関数が1秒あたり数千回(メインループの各反復中に何百回も使用されるため)呼び出される可能性があることと、おそらくこれらの関数のローカル作業変数(文字列、配列など)です。問題かもしれません。
私はより大きな/より重いオブジェクトのオブジェクトプーリングを知っています(そしてこれをある程度使用します)が、特にタイトなループで非常に何度も呼び出される関数に関連して、全面的に適用できるテクニックを探しています。
ガベージコレクターが行う必要のある作業量を減らすために、どのようなテクニックを使用できますか?
そして、おそらくまた-どのオブジェクトがどのオブジェクトが最もガベージコレクションされているかを特定するために使用できますか?(これはコードベースが非常に大きいため、ヒープのスナップショットを比較することはあまり実りがありませんでした)