JavaScriptでメモリを解放する方法
質問
私は canvas とその ImageData オブジェクトを使用していますが、このオブジェクトには膨大な量のデータ(数百万の整数)が含まれています。そのため、いくつかの配列で作業すると、すでに多くのメモリ(最大300MB)を消費しています。不要になった配列のメモリを解放する方法はありますか?私は
undefined
をその変数に代入しようとしています。それは正しいのでしょうか?
どのように解決するのですか?
変数が永続的で (たとえば、グローバルであったり、永続的なデータ構造の一部であったり)、それが指すデータが大きく、そのデータをガベージコレクションの対象にしたい場合、その変数に何か小さなものを代入するのが正しいでしょう。
undefined
または
null
または
""
はすべて動作します。 あなたがしていることは、大きなデータへの参照をクリアして、ガベージコレクションの対象とすることです。 もしあなたのJavaScriptの中にそのデータへの参照を持つものがなければ、ガベージコレクタによって解放することができます。 他の何かがそれへの参照を持っている場合、それは解放されません。
たとえば、グローバル変数に 10,000 要素の配列があった場合。
var largeDataArray = new Array(10000);
そして、ほとんどの要素をデータで満たした後、そのメモリに他の値を割り当てることによって、ガベージコレクションの対象とすることができます。
largeDataArray = null;
とか、それでも配列にしたい場合は
largeDataArray = [];
注意:それ自身がスコープ外に出た変数(持続的クロージャの一部ではない関数内のローカル変数のような)や、それ自身がスコープ外に出たオブジェクト内の変数は、手動で消去する必要はありません。 それらがスコープ外に出たとき、または親オブジェクトが削除されたとき、中に含まれるデータもガベージコレクションの対象となります。
つまり、変数のクリアは、長期間の変数に保持されているデータを明示的に解放したい場合にのみ行う必要があり、通常これを気にするのは、データが大きいか、その数が多くて数メガバイトになる場合のみです (デスクトップ ブラウザよりもスマートフォンでは、低レベルでのメモリ使用はより懸念されることです)。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?