トップ回答者
IE8でのJavaScriptによる画像表示

質問
-
こんにちは、mameと申します。
主に画像を表示するWebサイトを作成しているのですが、
IE8+Win7(SP1でも)の組合せでのみ以下の様な現状が起こります。<処理内容>
下記の様なJavaScriptで画像を順次切替える。
3分に一回程度。毎回ファイル及びファイル名は変更される。document.form1.TEST_IMG.src = "20110501112123.jpg"
<現象>
150kぐらいの画像ファイルで、読み込みの都度メモリが10M程度増える。
延々増え続け、更新を止めてしばらく放置しても特にメモリが減らない。srcを切替えているだけでメモリが増えてしまい、
対処方法が分らない状態です。
メモリの増加を抑える方法ないでしょうか?なお、Windows 2008 Server上のIE8では起こりません。
またIE9の場合、ある程度まで上昇のちメモリ量は増えなくなります。よろしくお願いします。
回答
-
確認しました。
IMGタグをご提示のものを使って、前回投稿したHTMLを差し替えたところ、
手元の環境でも再現いたしました。
Win7 SPなし& IE8 → 再現する( Private Bytesが画像を読むごとに単調増加。アドオンは全てOFFです。)
Win7 SP1 & IE9 → 再現しない
※メモリ増加サイズはJPGであれば、およそ縦px x 横px x 3Byte(24bit)を4KBで切り上げたサイズになるようですよ(ファイルの容量ではなく)。
最初に投稿いただいたとおり、とりあえずIE9では直ってしまっているようですね。 -
MSに問合せを行い、回答が来ましたので報告します。
「画像を処理する際に利用されるGDI+のBITMAPオブジェクトの開放手順に問題があるため」の
不具合との事でした。IE9ではDirectXを使用するように変更されたため、発生しない様です。
IE7でも再現する様なのですが、未検証です。
なおリモートデスクトップでIE8を使用する場合、GDI+を使用しないため
リークしないとの事です。この現象については回避策が無く、IE8の開発は終了している為
パッチの提供なども難しい様です。IE9を使用する、もしくはIE8を使用する場合はどこかのタイミングでブラウザやタブを
一旦終了し再表示する、といった方法しか無いみたいですね。ありがとうございました。
- 回答としてマーク 服部清次 2011年10月3日 5:18
すべての返信
-
色々と可能性のある事象だと思っています。どこからつぶすかですが、・ためしにサンプルを作ってみましたが、再現しませんでした。(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
-
検証頂きありがとうございます。
あの後また色々調査をして、原因箇所が分りました。「サイズを変更して画像表示するとメモリが増える」でした。
IMGタグの部分も載せておくべきでした。
申し訳ありません。お時間があれば、IMGタグを
<img id="TEST_IMG" src="" style="width:200px; height:200px; " />等とした場合どうなるか試して頂けますでしょうか?
IEで単純にサイズの大きなjpgをアドレス指定で表示した場合、プロパティの
「自動的にイメージのサイズを変更する」のチェックを付けると増加、
外すと増えませんでした。なおサイズについてはstyleで定義、そのままwidth,heightを定義、
JavaScritpで動的に定義のいずれでもメモリが増えてしまいました。 -
確認しました。
IMGタグをご提示のものを使って、前回投稿したHTMLを差し替えたところ、
手元の環境でも再現いたしました。
Win7 SPなし& IE8 → 再現する( Private Bytesが画像を読むごとに単調増加。アドオンは全てOFFです。)
Win7 SP1 & IE9 → 再現しない
※メモリ増加サイズはJPGであれば、およそ縦px x 横px x 3Byte(24bit)を4KBで切り上げたサイズになるようですよ(ファイルの容量ではなく)。
最初に投稿いただいたとおり、とりあえずIE9では直ってしまっているようですね。 -
-
mame_2011 さん、
こんにちは。
フォーラム オペレーターの服部 清次です。mame_2011 さんがこちらの質問を投稿されてから少し経ちましたが、
今回、参考情報として (´・ω・`) さんの回答を役立てていただけるのではないかと思いましたので、
勝手ながら、私の方でひとまず [回答としてマーク] させていただきました。また何か困った事や疑問などがありましたら、ぜひ MSDN/TechNet フォーラムをご利用ください。
今後とも、よろしくお願いします!
それでは、また。
__________________________________________________
日本マイクロソフト株式会社 フォーラム オペレーター 服部 清次 -
MSに問合せを行い、回答が来ましたので報告します。
「画像を処理する際に利用されるGDI+のBITMAPオブジェクトの開放手順に問題があるため」の
不具合との事でした。IE9ではDirectXを使用するように変更されたため、発生しない様です。
IE7でも再現する様なのですが、未検証です。
なおリモートデスクトップでIE8を使用する場合、GDI+を使用しないため
リークしないとの事です。この現象については回避策が無く、IE8の開発は終了している為
パッチの提供なども難しい様です。IE9を使用する、もしくはIE8を使用する場合はどこかのタイミングでブラウザやタブを
一旦終了し再表示する、といった方法しか無いみたいですね。ありがとうございました。
- 回答としてマーク 服部清次 2011年10月3日 5:18