QA@IT

ASP.NET(C#4.0)で作成したページのメモリリーク(IE8)

5603 PV

クライアントがIE8、サーバがWindowsServer2008R2/SQL Server2012R2という環境で開発しています
質問が2件あります

1.ASP.NETで作成したページがIEでメモリリークを起こして困っています
その際、IEがどんどんメモリを食ってしまい最終的にはクラッシュします
そのページは単純にGridViewが一つ張り付けてあり、ObjectDataSourceが、データセットデザイナからデータを取得しているだけです
その時のメッセージは、以下のようなエラーです
-エラー: ASP.NET Ajax クライアント側フレームワークを読み込めませんでした。
-エラー: 'Type' は宣言されていません。
-エラー: 'Sys' は宣言されていません。
以下のような記述をすると治ることがあるということだったので、入れてみたのですが効果ありませんでした
IE8でいいので、メモリリークを防ぐ方法はないでしょうか

  <system.web.extensions>
    <scripting>
      <scriptResourceHandler enableCompression="false" enableCaching="true"/>
    </scripting>
  </system.web.extensions>

ページの構造は単純で呼び出し側が、iframe内でリストのページを呼び出しているだけです
呼び出されるページはGridViewにデータベースのテーブルを表示しているだけです(最大30件)

//------------------呼び出し側
<script type="text/javascript">

        $(function () {
            setInterval("reload()", 30000); //30秒待ち
        });

        function reload() {         
            //データ部
            $("#frmData").prop("target", "frmMain");
            $("#frmData").prop("action", "datapage.aspx");
            $("#frmData").prop("target", "frmMain");
            $("#frmData").submit();
        }
</script>


<iframe width="900px" height="220px" scrolling="no" id="frmMain" name="frmMain" 
            frameborder="0" src="datapage.aspx">
    </iframe>
<form id="frmData" name="frmData"></form>
//呼び出される側
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="datapage.aspx.cs"
    Inherits="XXXX.datapage" EnableSessionState="False" %>

<asp:GridView ID="gvMain"   runat="server" AutoGenerateColumns="False" 
    DataSourceID="odSrc" ShowHeaderWhenEmpty="True" ShowHeader="False" 
        ClientIDMode="Static">

    <HeaderStyle CssClass="title" />
    <RowStyle CssClass="detail" />
</asp:GridView>

<asp:ObjectDataSource ID="odSrc" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" 
    TypeName="XXXX.dataobject.dsTableAdapters.XXX_TBLTableAdapter"></asp:ObjectDataSource>

2.IISがCPUを占有してしまう
上記のページを長時間複数端末で表示しっぱなしにすると数時間たつとw3wp.exeがCPUを占領してしまいます
セッションは使用しないのでEnableSessionState="False"としてみましたが効果はありませんでした

他に、何か原因になりそうなのは、何があるでしょう

  • インターバルを30秒から100ミリ秒などに変えた場合には数時間またなくてもワーカープロセスがCPUを占領しますか? -

回答

そのページは単純にGridViewが一つ張り付けてあり、ObjectDataSourceが、データセット
デザイナからデータを取得しているだけです

それは間違いないですか?

ScriptManager もしくは ToolkitScriptManager を使っているのでは? でなければ、

-エラー: ASP.NET Ajax クライアント側フレームワークを読み込めませんでした。

などのエラーは出ないと思いますが。よく確認して、正しい情報を書いていただけませんか。

ページの構造は単純で呼び出し側が、iframe内でリストのページを呼び出しているだけです

それが問題の原因かどうかは分かりませんが、呼び出し方はそれでいいのでしょうか? 少なくとも自分の理解を超えてます。(自分の理解が足りないと言う可能性は否定し切れませんが)

以下のようにしないのはどうしてですか?

<script type="text/javascript">
$(function () {
    setInterval("reload()", 30000); //30秒待ち
});

function reload() {         
    document.getElementById('frmMain').contentWindow.location.href = 
        'datapage.aspx';
}
</script>

<iframe width="900px" height="220px" scrolling="no" 
    id="frmMain" name="frmMain" frameborder="0">
</iframe>

2.IISがCPUを占有してしまう

タイトルには IE のメモリーリークとありますが、それだけではなくサーバー側でも問題があるのですか?

何も分からないまま、質問を投げたと言うような感じがしますが、何が本当の原因かもう少し切り分けられないですか?

【追伸】

原因が IE のメモリーリークなのかどうか分かりませんが、その場合は以下のページが参考になると思います。

Internet Explorer リーク パターンを理解して解決する
http://msdn.microsoft.com/ja-jp/library/bb250448(v=vs.85).aspx

【追伸2】
たびたびすみません。

setTimeout と勘違いしていました。setInterval で 30 秒ごとに呼び出すんですね。

IE のメモリーリークではなくて、そのあたりが問題のような気がします。いずれにしても、もう少し切り分けられませんか。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。