web-dev-qa-db-ja.com

JavaScriptでメモリを解放する方法

膨大な量のデータ(数百万の整数)を含むキャンバスとそのImageDataオブジェクトを使用しています。そのため、いくつかのアレイを操作するには、すでに大量のメモリ(最大300MB)が必要です。不要なアレイのメモリを解放する方法はありますか? undefinedをその変数に割り当てようとしています。正しいですか?

63
haynar

変数が持続する場合(たとえば、グローバルまたは何らかの永続データ構造の一部)、変数が指すデータが大きく、そのデータをガベージコレクションに適格にしたい場合は、その変数に小さな値を割り当てることは正しいことです。 undefinedまたはnullまたは""はすべて機能します。ガベージコレクションの対象となるように、大規模データへの参照をクリアしています。あなたのjavascriptに他にそのデータへの参照がない場合は、ガベージコレクターによって解放できます。他に何かへの参照がある場合は、解放できません。

たとえば、グローバル変数に10,000個の要素配列がある場合:

var largeDataArray = new Array(10000);

そして、ほとんどの要素をデータで満たしたので、次のような他の値を割り当てることにより、そのメモリをガベージコレクションに適格にすることができます。

largeDataArray = null;

または、まだ配列にしたい場合:

largeDataArray = [];

注:スコープから外れる変数(永続的なクロージャーの一部ではない関数内のローカル変数など)またはオブジェクト内の変数自体がスコープ外になる場合、手動でクリアする必要はありません。それらが範囲外になるか、親オブジェクトが削除されると、その中に含まれるデータもガベージコレクションの対象になります。

したがって、変数のクリアは、長持ちする変数に保持されているデータを明示的に解放する必要がある場合にのみ行う必要があり、通常、データが大きい場合や追加するデータが多い場合にのみ心配する必要があります最大数メガバイトのデータ(デスクトップブラウザーよりもスマートフォンの低レベルでのメモリ使用の方が重要です)。

103
jfriend00

JavaScriptには自動メモリ管理があります。参照されなくなったオブジェクトを含むメモリは、メモリリークがない限り、ガベージコレクションの対象となります。 通常、undefinedを変数に手動で割り当てる必要はありません。

プログラムが大量のメモリを使用している場合、不要になった要素を取り除くために配列をshrinkする必要があります。見る - Array.popArray.shift 、および Array.splice

4
Matt Ball