2

JavaScriptを使用してX秒ごとにページを自動的に更新すると、メモリリークが発生します。このリークはFirefoxまたはChromeで発生しておらず、IE7/8/10でも発生していないことを確認しました。IE9のみです(私はWin7を使用しています)。

私が夢中になっているのは、IE9でこれを見て、メモリ使用量が増加するのを見ると、IEで開発者ツールを開き、ブラウザモードをIE8に変更すると、ページが続くにつれてメモリが増加しなくなることです。リロードします。IE9モードに戻すと、再び上昇し始めます。

以下のサンプルページはリークを示すモックアップですが、私が経験しているページは、私が1日中開いたままにしている監視ページです。IE9でこのページを数時間開いたままにすると、最終的に32ビットアプリケーションがアクセスできるすべてのメモリ(〜1.5Gb)を使い果たし、IEが応答しなくなります。

このサンプルページをdrip-0.5IEJSLeaksDetectorで見てきましたが、これらのリークファインダーはどちらも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が含まれているコンテンツページであるということです。Pag​​e_Loadのコードを介して削除する必要があると思います。それが私が行かなければならない解決策である場合。

.NET 4.0 ScriptManager Javascriptsで1〜2 MBのメモリリークが発生している人は他にいますか?

リークを回避してScriptManagerをページに残すために他にできることはありますか?

ありがとう!

4

1 に答える 1

0

私の推測では、間隔を明示的に停止する必要があります。

clearInterval(秒);

15に達したとき。

于 2013-01-11T21:48:23.043 に答える