JavaScriptを使用してX秒ごとにページを自動的に更新すると、メモリリークが発生します。このリークはFirefoxまたはChromeで発生しておらず、IE7/8/10でも発生していないことを確認しました。IE9のみです(私はWin7を使用しています)。
私が夢中になっているのは、IE9でこれを見て、メモリ使用量が増加するのを見ると、IEで開発者ツールを開き、ブラウザモードをIE8に変更すると、ページが続くにつれてメモリが増加しなくなることです。リロードします。IE9モードに戻すと、再び上昇し始めます。
以下のサンプルページはリークを示すモックアップですが、私が経験しているページは、私が1日中開いたままにしている監視ページです。IE9でこのページを数時間開いたままにすると、最終的に32ビットアプリケーションがアクセスできるすべてのメモリ(〜1.5Gb)を使い果たし、IEが応答しなくなります。
このサンプルページをdrip-0.5とIEJSLeaksDetectorで見てきましたが、これらのリークファインダーはどちらもIE7レンダリングエンジンに基づいており、これは問題ではありません。そして、これらのツールはどちらも問題はありません。
これを軽減するために(別のブラウザを使用する以外に)何ができますか、または何かできることはありますか?
サンプルの.aspxファイルは以下のとおりです。
<html>
<head>
<title></title>
<script type="text/javascript">
var sec = 15;
function pageLoad() {
setInterval(updReload, 1000);
}
function updReload() {
if (sec == 0) {
window.location.reload();
} else {
document.getElementById('spnReload').innerHTML = sec--;
}
}
</script>
</head>
<body>
<form id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<h1>Current Time is: <%=Now.ToShortTimeString() %></h1>
Reload in: <span id="spnReload"></span>
</form>
</body>
</html>
更新:
これが私が発見したばかりの新しいしわです:IE9クァークズモードにはリークがないようです-IE9標準モードのみです。ブラウザモードをIE8に設定しても、ドキュメントモードがIE9標準の場合、メモリリークが発生します。
Update2: このサンプルページを従来のASPファイルで再作成しようとしましたが、上記のサンプルファイルに示されているメモリリークは発生しませんでした。そこで、.NET独自のJavaScript関数に関連しているのではないかと考え始めました。コメントアウトしてbodyタグに
ScriptManager
追加するonload="pageLoad()"
と、メモリリークがリロードあたり1〜2MBからリロードあたり約80KBに減少しました。更新されたコードはここにあります:
<html>
<head>
<title></title>
<script type="text/javascript">
var sec = 15;
function pageLoad() {
setTimeout(updReload, 1000);
}
function updReload() {
if (sec == 0) {
window.location.reload();
} else {
document.getElementById('spnReload').innerHTML = --sec;
setTimeout(updReload, 1000);
}
}
</script>
</head>
<body onload="pageLoad()">
<form id="Form1" runat="server">
<%--<asp:ScriptManager ID="ScriptManager1" runat="server" />--%>
<h1>Current Time is: <%=Now.ToShortTimeString() %></h1>
Reload in: <span id="spnReload"></span>
</form>
</body>
</html>
まだ少しリークしていますが、おそらくそれで生きることができます。問題は、これが発生している本番ページが、マスターページにScriptManagerが含まれているコンテンツページであるということです。Page_Loadのコードを介して削除する必要があると思います。それが私が行かなければならない解決策である場合。
.NET 4.0 ScriptManager Javascriptsで1〜2 MBのメモリリークが発生している人は他にいますか?
リークを回避してScriptManagerをページに残すために他にできることはありますか?
ありがとう!