1. ホーム
  2. javascript

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

2023-11-13 03:09:52

質問

私は canvas とその ImageData オブジェクトを使用していますが、このオブジェクトには膨大な量のデータ(数百万の整数)が含まれています。そのため、いくつかの配列で作業すると、すでに多くのメモリ(最大300MB)を消費しています。不要になった配列のメモリを解放する方法はありますか?私は undefined をその変数に代入しようとしています。それは正しいのでしょうか?

どのように解決するのですか?

変数が永続的で (たとえば、グローバルであったり、永続的なデータ構造の一部であったり)、それが指すデータが大きく、そのデータをガベージコレクションの対象にしたい場合、その変数に何か小さなものを代入するのが正しいでしょう。 undefined または null または "" はすべて動作します。 あなたがしていることは、大きなデータへの参照をクリアして、ガベージコレクションの対象とすることです。 もしあなたのJavaScriptの中にそのデータへの参照を持つものがなければ、ガベージコレクタによって解放することができます。 他の何かがそれへの参照を持っている場合、それは解放されません。

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

var largeDataArray = new Array(10000);

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

largeDataArray = null;

とか、それでも配列にしたい場合は

largeDataArray = [];

注意:それ自身がスコープ外に出た変数(持続的クロージャの一部ではない関数内のローカル変数のような)や、それ自身がスコープ外に出たオブジェクト内の変数は、手動で消去する必要はありません。 それらがスコープ外に出たとき、または親オブジェクトが削除されたとき、中に含まれるデータもガベージコレクションの対象となります。

つまり、変数のクリアは、長期間の変数に保持されているデータを明示的に解放したい場合にのみ行う必要があり、通常これを気にするのは、データが大きいか、その数が多くて数メガバイトになる場合のみです (デスクトップ ブラウザよりもスマートフォンでは、低レベルでのメモリ使用はより懸念されることです)。