JSによくあるメモリ漏れ及び利用可能な解決方法
2519 ワード
メモリ漏れ
メモリ漏れ(メモリリーク)とは、プログラム中に自分のダイナミックに割り当てられたヒープメモリが何らかの理由でプログラムが解放されなかったり、解放されなかったりして、システムメモリの浪費を引き起こし、プログラムの運行速度が遅くなり、システムが崩壊するなどの重大な結果をもたらすことです.通俗的なポイントは、不注意やエラーによって、プログラムがリリースされなくなりました.もう使わないメモリは即時にリリースされなくなり、メモリの無駄が生じます.
メモリの漏洩を避ける?
一部の作用域では、変数が存在する必要がなくなり、ゴミ回収メカニズムがマイナスに判断されて回収されますが、グローバル変数については、いつこれらの変数を使わないと判断できません.正常に回収できません.したがって、グローバル変数はなるべく少なく使います.クローズドを使うと、深刻なメモリ漏れが発生します.クローズド中の局部変数は、メモリに保存されています.
メモリオーバーフロー
プログラム運転に必要なメモリが残りのメモリを超えた場合、メモリオーバーフローのエラーが発生します.たとえば、下のコードは慎重にテストします.カードウィンドウがあります....
1.意外なグローバル変数
jsでは、未宣言変数の使用は、グローバルオブジェクトに新しい変数を作成します.ブラウザ環境では、全体のオブジェクトはwindowです.
タイマーset Intervalまたはset Timeoutは、使用する必要がない時に、clearがないため、タイマーのコールバック関数と内部依存変数が回収できなくなり、メモリ漏れを引き起こします.解決方法:intervalまたはtimeoutが必要でない場合は、clear IntervalまたはclearTimeoutを呼び出します.
3.DOM漏れ
1)DOMオブジェクトに付加する属性はオブジェクトの参照です.
4.js閉包
IE 6に閉じ込めるとメモリが漏れますが、今は考えなくてもいいです.注意すべきなのは、クローズド自体がメモリ漏れを引き起こすことはないが、閉じすぎてメモリ漏れを起こしやすいことです.クローズドは、オブジェクト参照のライフサイクルを現在の関数から逸脱させます.もしクローズドが正しく使えば、リング参照(cirular reference)を引き起こします.デッドロックのようなもので、発生しない限り解決できません.ゴミ回収があっても、内部に漏れがあります.
これは、別の時間を探して詳しく説明してください.ここでは詳しく説明しません.
5.ソロ
コンソールのログ記録は全体のメモリにファイルを内蔵する影響に対して、重大な問題であり、同時に無視されやすいです.エラーを記録したオブジェクトは、大量のデータをメモリに保存することができます.consone.logsに送る対象はゴミ回収ができないので、consolie.logsを削除しないとメモリが漏れてしまう可能性があります.
メモリ漏れ(メモリリーク)とは、プログラム中に自分のダイナミックに割り当てられたヒープメモリが何らかの理由でプログラムが解放されなかったり、解放されなかったりして、システムメモリの浪費を引き起こし、プログラムの運行速度が遅くなり、システムが崩壊するなどの重大な結果をもたらすことです.通俗的なポイントは、不注意やエラーによって、プログラムがリリースされなくなりました.もう使わないメモリは即時にリリースされなくなり、メモリの無駄が生じます.
メモリの漏洩を避ける?
一部の作用域では、変数が存在する必要がなくなり、ゴミ回収メカニズムがマイナスに判断されて回収されますが、グローバル変数については、いつこれらの変数を使わないと判断できません.正常に回収できません.したがって、グローバル変数はなるべく少なく使います.クローズドを使うと、深刻なメモリ漏れが発生します.クローズド中の局部変数は、メモリに保存されています.
メモリオーバーフロー
プログラム運転に必要なメモリが残りのメモリを超えた場合、メモリオーバーフローのエラーが発生します.たとえば、下のコードは慎重にテストします.カードウィンドウがあります....
var obj = {}
for (var i = 0; i < 100000; i++) {
obj[i] = new Array(10000000)
}
console.log('------')
よくあるjsメモリの漏れ1.意外なグローバル変数
jsでは、未宣言変数の使用は、グローバルオブジェクトに新しい変数を作成します.ブラウザ環境では、全体のオブジェクトはwindowです.
function foo() {
a = 'test'
}
//
function foo() {
window.a = 'test'
}
function foo() {
this.a = 'test'
// ,this window
}
foo();
上のa変数はfoo()内部作用域変数の参照であるべきで、varを使用してこの変数を宣言していないため、変数aはグローバル変数として作成されます.これは間違っています.メモリ漏れの原因となります.解決方法:jsファイルの先頭に‘use strict’を追加し、厳格モードをオープンします.(または、使用後のグローバル変数をnullに設定したり、値を再割り当てしたりするのが一般的です.これに関連するキャッシュの問題です.注意が必要です.)
"use strict";
console.log(" 。");
console.log(" 。");
2.タイマーとコールバック関数timersタイマーset Intervalまたはset Timeoutは、使用する必要がない時に、clearがないため、タイマーのコールバック関数と内部依存変数が回収できなくなり、メモリ漏れを引き起こします.解決方法:intervalまたはtimeoutが必要でない場合は、clear IntervalまたはclearTimeoutを呼び出します.
3.DOM漏れ
1)DOMオブジェクトに付加する属性はオブジェクトの参照です.
var a = {};
document.getElementById('id').diyProp = a;
解決方法:window.onload時間にdocument.getElementById('id').diyProp = null;
を追加しました.要素参照は整理されていません.var a = document.getElementById('id');
document.body.removeChild(a);
// , a 。 removeChild , # , DOM 。
解決方法:a = null;
3)イベントのバインディングが除去されていません.4.js閉包
IE 6に閉じ込めるとメモリが漏れますが、今は考えなくてもいいです.注意すべきなのは、クローズド自体がメモリ漏れを引き起こすことはないが、閉じすぎてメモリ漏れを起こしやすいことです.クローズドは、オブジェクト参照のライフサイクルを現在の関数から逸脱させます.もしクローズドが正しく使えば、リング参照(cirular reference)を引き起こします.デッドロックのようなもので、発生しない限り解決できません.ゴミ回収があっても、内部に漏れがあります.
これは、別の時間を探して詳しく説明してください.ここでは詳しく説明しません.
5.ソロ
コンソールのログ記録は全体のメモリにファイルを内蔵する影響に対して、重大な問題であり、同時に無視されやすいです.エラーを記録したオブジェクトは、大量のデータをメモリに保存することができます.consone.logsに送る対象はゴミ回収ができないので、consolie.logsを削除しないとメモリが漏れてしまう可能性があります.