none
IE8でのJavaScriptによる画像表示 RRS feed

  • 質問

  • こんにちは、mameと申します。

    主に画像を表示するWebサイトを作成しているのですが、
    IE8+Win7(SP1でも)の組合せでのみ以下の様な現状が起こります。

    <処理内容>
    下記の様なJavaScriptで画像を順次切替える。
    3分に一回程度。毎回ファイル及びファイル名は変更される。

    document.form1.TEST_IMG.src = "20110501112123.jpg"

    <現象>
    150kぐらいの画像ファイルで、読み込みの都度メモリが10M程度増える。
    延々増え続け、更新を止めてしばらく放置しても特にメモリが減らない。

    srcを切替えているだけでメモリが増えてしまい、
    対処方法が分らない状態です。
    メモリの増加を抑える方法ないでしょうか?

    なお、Windows 2008 Server上のIE8では起こりません。
    またIE9の場合、ある程度まで上昇のちメモリ量は増えなくなります。

    よろしくお願いします。

    2011年9月18日 11:52

回答

  • 確認しました。
     
    IMGタグをご提示のものを使って、前回投稿したHTMLを差し替えたところ、
    手元の環境でも再現いたしました。
     
    Win7 SPなし& IE8 → 再現する( Private Bytesが画像を読むごとに単調増加。アドオンは全てOFFです。)
    Win7 SP1  & IE9 → 再現しない
     
    ※メモリ増加サイズはJPGであれば、およそ縦px x 横px x 3Byte(24bit)を4KBで切り上げたサイズになるようですよ(ファイルの容量ではなく)。

     
    最初に投稿いただいたとおり、とりあえずIE9では直ってしまっているようですね。  

    • 回答の候補に設定 服部清次 2011年9月21日 4:42
    • 回答としてマーク 服部清次 2011年9月28日 5:14
    2011年9月20日 13:54
  • MSに問合せを行い、回答が来ましたので報告します。

    「画像を処理する際に利用されるGDI+のBITMAPオブジェクトの開放手順に問題があるため」の
    不具合との事でした。

    IE9ではDirectXを使用するように変更されたため、発生しない様です。
    IE7でも再現する様なのですが、未検証です。
    なおリモートデスクトップでIE8を使用する場合、GDI+を使用しないため
    リークしないとの事です。

    この現象については回避策が無く、IE8の開発は終了している為
    パッチの提供なども難しい様です。

    IE9を使用する、もしくはIE8を使用する場合はどこかのタイミングでブラウザやタブを
    一旦終了し再表示する、といった方法しか無いみたいですね。

    ありがとうございました。

    • 回答としてマーク 服部清次 2011年10月3日 5:18
    2011年10月3日 2:00

すべての返信

  • 色々と可能性のある事象だと思っています。
     
    どこからつぶすかですが、
     
    ・ためしにサンプルを作ってみましたが、再現しませんでした。(Win7 32bit SPなし&IE8)
    そちらではいかがでしょうか。
    もしかして3分という条件が影響するのでしょうか?
     
    ・なんだか、メモリ食いすぎな気がするんですよね。(画像の解像度が不明ですが)
    デバッグ用のアドオンを動かしているならOFFにしてみるとかどうでしょう?
     
    ・調査のお供にVMMapを使って、大きいサイズ順でソート表示しながら常時確認が効きくかもです。"10M"単位で何かいるかも。
     
    ・普通に、メモリーリークしてしまうような書き方を疑ってしまうのですが(イベント開放が正しく行われていないとか)、
    ご提示のサンプルでは関係がなさそうだと思いました。
     
    ■確認したサンプル
    4秒ごとに、2048x1536pxの590kByteのjpg画像を読み込んでいます。 
    <html><head>
    <title>memory leak test</title>
    <script>
    function win_load(){
    	setInterval(timer_callback, 4000);
    	timer_callback();
    }
    var i = 0;
    function timer_callback(){
    	document.form1.TEST_IMG.src = ((i++)%35) + ".jpg"
    	document.getElementById("out1").innerHTML = i;
    }
    window.onload = win_load;
    </script></head>
    <body>
    <form name=form1>
    <img name="TEST_IMG" />
    </form>
    <div id="out1"></div>
    </body></html>
    

    ■結果
    少なくともPrivate Bytesには変化が見られませんでした。 IOの山が画像を読み込んでいる瞬間です。
     
     
    • 回答の候補に設定 服部清次 2011年9月21日 4:41
    2011年9月19日 16:00
  • 検証頂きありがとうございます。
    あの後また色々調査をして、原因箇所が分りました。

    「サイズを変更して画像表示するとメモリが増える」でした。
    IMGタグの部分も載せておくべきでした。
    申し訳ありません。

    お時間があれば、IMGタグを
    <img id="TEST_IMG" src="" style="width:200px; height:200px; " />

    等とした場合どうなるか試して頂けますでしょうか?

    IEで単純にサイズの大きなjpgをアドレス指定で表示した場合、プロパティの
    「自動的にイメージのサイズを変更する」のチェックを付けると増加、
    外すと増えませんでした。

    なおサイズについてはstyleで定義、そのままwidth,heightを定義、
    JavaScritpで動的に定義のいずれでもメモリが増えてしまいました。

     

    2011年9月20日 0:07
  • 確認しました。
     
    IMGタグをご提示のものを使って、前回投稿したHTMLを差し替えたところ、
    手元の環境でも再現いたしました。
     
    Win7 SPなし& IE8 → 再現する( Private Bytesが画像を読むごとに単調増加。アドオンは全てOFFです。)
    Win7 SP1  & IE9 → 再現しない
     
    ※メモリ増加サイズはJPGであれば、およそ縦px x 横px x 3Byte(24bit)を4KBで切り上げたサイズになるようですよ(ファイルの容量ではなく)。

     
    最初に投稿いただいたとおり、とりあえずIE9では直ってしまっているようですね。  

    • 回答の候補に設定 服部清次 2011年9月21日 4:42
    • 回答としてマーク 服部清次 2011年9月28日 5:14
    2011年9月20日 13:54
  • >> (´・ω・`)さん

    度々ありがとうございます。
    画像の容量ではなく、縦横サイズに比例してメモリが増加する
    という事ですね。

    (´・ω・`)さんの環境でも発生したとの事で、
    特定の環境に起因する問題ではなくIE8の問題と言えそうなので
    問合せを行ってみます。

    なお、最初の書き込みに2008Serverでは発生しなかったと
    書きましたが、誤りでした。2008Serverでも発生していました。
    XPからリモートデスクトップで接続して実行するとメモリが増えないようです。

    また何か分りましたら書き込ませて頂きます。
    ありがとうございました。

    2011年9月21日 1:20
  • mame_2011 さん、

    こんにちは。
    フォーラム オペレーターの服部 清次です。

    mame_2011 さんがこちらの質問を投稿されてから少し経ちましたが、
    今回、参考情報として (´・ω・`) さんの回答を役立てていただけるのではないかと思いましたので、
    勝手ながら、私の方でひとまず [回答としてマーク] させていただきました。

    また何か困った事や疑問などがありましたら、ぜひ MSDN/TechNet フォーラムをご利用ください。
    今後とも、よろしくお願いします!
    それでは、また。


    __________________________________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 服部 清次

    2011年9月28日 5:21
  • MSに問合せを行い、回答が来ましたので報告します。

    「画像を処理する際に利用されるGDI+のBITMAPオブジェクトの開放手順に問題があるため」の
    不具合との事でした。

    IE9ではDirectXを使用するように変更されたため、発生しない様です。
    IE7でも再現する様なのですが、未検証です。
    なおリモートデスクトップでIE8を使用する場合、GDI+を使用しないため
    リークしないとの事です。

    この現象については回避策が無く、IE8の開発は終了している為
    パッチの提供なども難しい様です。

    IE9を使用する、もしくはIE8を使用する場合はどこかのタイミングでブラウザやタブを
    一旦終了し再表示する、といった方法しか無いみたいですね。

    ありがとうございました。

    • 回答としてマーク 服部清次 2011年10月3日 5:18
    2011年10月3日 2:00