JavaScriptのメモリリークの原因となるコードの種類を理解しておき、以下のスクリプトを作成しました。しかし、OS X上のSafari 6.0.4でスクリプトを実行すると、アクティビティモニタに表示されるメモリ消費量はそれほど増加しません。JavaScriptでメモリリークを作成するにはどうすればよいですか?
スクリプトに問題がありますか、これは最新のブラウザの問題ではありませんか?
<html>
<body>
</body>
<script>
var i, el;
function attachAlert(element) {
element.onclick = function() { alert(element.innerHTML); };
}
for (i = 0; i < 1000000; i++) {
el = document.createElement('div');
el.innerHTML = i;
attachAlert(el);
}
</script>
</html>
スクリプトは、GoogleのJavaScriptのスタイルガイドの閉鎖区間に基づいています。 http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Closures#Closures
EDIT:漏れるために上記のコードを引き起こしたバグが明らかに修正されました:http://jibbering.com/faq/notes/closures/#clMem
しかし、私の誰かが現代的なブラウザでメモリをリークするJavaScriptコードの現実的な例を提供できるだろうか?
インターネットでは、複雑なシングルページアプリケーションでメモリリークが問題になることがあるとの記事がたくさんありますが、ブラウザで実行できる例が見つからない場合があります。
返信いただきありがとうございます。イラストレーションのために私のスクリプトの修正版を投稿できるでしょうか? – user2327642
完了。うまくいけば助けてくれます。 – Stephen
ありがとうございますが、これは関連する例ではないと思います。作成されたすべての要素への参照を格納する場合、それらがガベージコレクションされるとは思われません。私のコードのポイントは、クロージャが循環参照を作成するものです。サーキュラーリファレンスはガベージコレクターにとっては問題ありませんが、私が今学んだように、サーキュラーリファレンスに含まれるオブジェクトの1つがDOMエレメントであったときにガベージコレクションが動作しないバグがありました。 – user2327642