メモリー使用量が増える現象 (メモリリーク)

今回は Internet Explorer を利用している場合に発生するメモリー使用量が増える現象についてお話しします。

 

なお、本記事に掲載している内容は、Internet Explorer 以外の、例えば Microsoft Edge や Google Chrome、Firefox といったほかのブラウザーでも有効な部分があります。ぜひ参考にしてみてください。

 

そこそこのボリュームがあるため、全部で 2 回に分けて記事をまとめる予定です。

Internet Explorer を利用しているときに「あれ?おかしいな…」と思ったら、下記手順に従い確認をしてみてください。

 

第 1 回 : メモリー使用量が増える現象 (本記事)
第 2 回 : メモリー使用量が増える具体的な例 (執筆中)

 

本記事では、Internet Explorer を利用している場合のメモリー使用量が増える現象について、まずは一般的な知識と、それを切り分ける方法についてまとめました。

Internet Explorer 上でのメモリー使用量の増加の現象は、単純な方法での調査が難しく、本記事に記載したような内容をコツコツと時間をかけて確認する必要があり非常にお時間がかかるケースが多いですが、少しでも参考になれば幸いです。

 

1. メモリー使用量が増えるのはなぜ?

そもそも Internet Explorer で Web ページを閲覧していると、徐々にメモリー使用量が増えていくのはなぜなのでしょうか。

 

この疑問に答えるには、まずブラウザーって何?という点を理解する必要があります。

 

ご存じのとおり、Internet Explorer をはじめとする “Web ブラウザー” は Web コンテンツ (html や CSS、JavaScript、画像、動画などなど) を表示 / 動作させるための、いわば「プラットフォーム」です。これは、Windows や Mac などのプラットフォーム (OS) 上で任意のアプリケーションを動作させるのと同じイメージです。ブラウザーというプラットフォーム上で「Web コンテンツ」というアプリケーションを動作させています。

 

まず、OS 上で動作するアプリケーションが利用するメモリー使用量が増加する傾向がみられる場合を考えましょう。

この場合に考えられるポイントは、「プログラム内で確保したメモリー領域がきちんと解放されていない」ことです。いわゆる、メモリリークです。

 

では、Web コンテンツを表示しているブラウザーのメモリー使用量に増加傾向がみられる場合には何が考えられるでしょうか。

実は、基本的には通常のアプリケーションでの状況と同様に、ブラウザーというプラットフォーム上で動作する Web コンテンツの作りに強く依存していることが多く、Web コンテンツ自体の構成やその中で行われている処理が影響してメモリー使用量が増加している可能性があります。

 

また、Internet Explorer の場合には、ActiveX コントロールやブラウザー ヘルパー オブジェクト (BHO)、ツール バーといったアドオンを利用することができますが、これらの中で上記に記載したような「プログラム内で確保したメモリー領域がきちんと解放されていない」現象が発生しており、これらが影響してメモリー使用量が増加している可能性もあります。これらのアドオンは、C や C++ などのネイティブ言語で作成される場合が多く、通常のアプリケーションと同様に、プログラム内で独自に、自由に、メモリー領域を確保することができます。

さらに、何らかのソフトウェアが、Internet Explorer で行われている処理を外部から参照して (場合によってはフック (本来の処理を迂回させてオレオレな処理を実行する手法) して) いることなどが影響している可能性も考えられる一つのポイントです。

 

2. メモリーが枯渇すると何が起きる?

では、メモリー使用量が増えていくと何かが起きるのでしょうか。

 

端的には「メモリーの枯渇」という状態に内部的に陥ります。

 

Internet Explorer の場合、既定の状態では OS が 64bit 環境だとしても、コンテンツを表示するプロセス (タブ プロセスもしくはコンテンツ プロセス) は 32bit プロセスとして動作します。

 

Windows OS の仕組み上、32bit プロセスでアプリケーションが自由に利用できるメモリー領域の上限は理論値として 2GB です。

しかしながら、実際にはメモリー上で断片化などが発生することにより、メモリー使用量が 1GB – 1.5GB を超えたあたりからプログラムからのメモリー確保の処理に失敗する場合が出てきます。

この動作は、端末上に搭載されている物理メモリー量に関係なく、また、タスク マネージャー上で確認のできるメモリーの空き容量とも関係はありません。あくまでも、単一のプロセスで利用することのできるメモリー領域が対象となります。

 

Internet Explorer では、Web コンテンツを表示する際に内部的にメモリー領域を確保する必要がありますが、上記のような状態となっているとメモリー領域の確保に失敗する場合があり、この結果 Web コンテンツを正しく表示できない (表示が崩れる)、そもそも真っ白で何も表示されない、クラッシュしてしまう、などの影響が生じます。

 

このような問題が発生した場合には、タスク マネージャーなどで Internet Explorer のプロセス (iexplore.exe) の状態を確認し、メモリー使用量が 1GB – 1.5GB 以上使用している状態であれば、メモリー枯渇が原因である可能性が高いと判断ができます。

 

なお、64bit OS 環境下で、拡張保護モードが有効で動作している場合には 64bit でプロセスが動作するため、上述したような 2GB という制限はありません。理論値としては 8TB (テラ バイト) です。

 

参考: 仮想アドレス領域
https://msdn.microsoft.com/ja-jp/library/windows/hardware/hh439648(v=vs.85).aspx

 

即時的な解決方法としては、起動中の Internet Explorer をすべて終了し再起動しなおすこと、になりますが、本格的に調査を進める場合には、後述の点を少しずつ切り分けていく必要があります。

 

3. どうやって切り分けができるか?

このような状況となる原因を特定するために、何を確認すれば良いでしょうか。

私たちサポート チームにお問い合わせをいただいた際には、お客様に対してまずは以下の点の確認を依頼させていただくことが多いです。

 

お問い合わせをご検討される際には、下記の確認結果や作成いただいたサンプル プログラムとともに弊社までご連絡いただけるとスムーズに調査を開始することができます。なお、お問い合わせの際には「プレミア サポート」をご利用いただいたほうが詳細なデバッグ調査を含めた本格的な支援をさせていただくことが可能です。

 

  • メモリーの増え方を確認する
  • ドキュメント モードを変更してみる
  • 環境ごとに差異がないか確認する
  • 最新の更新プログラムを適用する
  • アドオン無効を試す
  • サードパーティー製ソフトウェアをアンインストールする
  • クリーンな環境で試す
  • コンテンツを切り分ける

 

一つずつ見ていきましょう。

 

メモリーの増え方を確認する

タスク マネージャーなどで、右肩上がりにメモリー使用量が増えるのか、ある一定の使用量を上限に横ばいとなるのか確認しましょう。

ある一定の使用量を上限に横ばいとなる場合には、Web コンテンツ上の構成が非常に大量のメモリーを必要とするものの、コンテンツとしても、Internet Explorer の動作としても問題ない動作であると判断ができます。

 

Internet Explorer では、Web コンテンツを表示 / 動作させるためにメモリー領域を確保する動作となるため、一定量増えることは Web コンテンツを表示 / 動作させるうえでの想定動作となります。ページ遷移などに伴い、不要となったメモリー領域については “ガベージ コレクション” という仕組みの下で一定時間後に自動的に解放される動作となります。

 

このような状況の場合には、後述している「コンテンツの切り分け」により、メモリーを大量に消費する部分を特定することでよりスリムに動作するコンテンツに修正できる可能性があります。

 

ドキュメント モードを変更してみる

Internet Explorer には過去のバージョンとの互換性を維持するために「ドキュメント モード」という機能が搭載されています。

この「ドキュメント モード」を変更することで現象に差異が生じるかどうか確認しましょう。

 

ドキュメント モードの変更には下記のいずれかが利用できます。

なお、<meta> による定義を行う場合には、現象に関連するすべての html ファイルに含める必要があるため、検証目的の場合には HTTP 応答ヘッダーに含める方が容易かと思います。

 

<meta> による定義 : 以下の定義を <head> 要素の先頭に追記します
<meta http-equiv=”X-UA-Compatible” content=”IE=xxx” />

 

HTTP 応答ヘッダーによる定義 : 以下のヘッダーを HTTP 応答ヘッダーに含めるようにします
X-UA-Compatible: IE=xxx

 

※ IE=xxx の “xxx” 部分には 11/10/9/8/7/5 のいずれかを設定します

 

環境ごとに差異がないか確認する

一部の環境だけで発生するのか、すべての環境で発生するのか確認しましょう。

また、異なる OS 上の同一バージョンの Internet Explorer を利用した場合に動作に差異が出ないか確認しましょう。

 

一部の環境でのみ発生する現象の場合、当該の環境にのみインストールされている何らかのアドオンやソフトウェアの影響が推測されます。次項以降のアドオンの無効やサードパーティー製のソフトウェアのアンインストールなどを試してみましょう。

 

最新の更新プログラムを適用する

残念ながら、製品自体の動作が起因してメモリー使用量が増える場合もあります。

毎月公開されている Internet Explorer や Microsoft Edge 向けの更新プログラムを提供することで現象に差異が生じるかどうか確認しましょう。

 

なお、Windows 7 / 8.1 の環境では、Internet Explorer 向けの更新プログラムが個別に提供されていますが、Windows 10 においては Internet Explorer / Microsoft Edge ともに OS の更新プログラム (ロールアップ) に含まれています。

 

アドオン無効を試す

Web コンテンツ上で ActiveX コントロールを利用している場合にはその使用をやめてみる、BHO やツール バーなどが導入されている場合にはそれらのアドオンをアンインストールしてみる、ことにより現象が改善するかどうか確認しましょう。

 

アドオン無効により劇的に状況が改善する場合には、アドオンの動作が影響していると判断することができます。

この状況の場合には、アドオン内の処理において問題となる点がないかどうか確認してください。また、サードパーティー製のアドオンである場合には、開発元にお問い合わせしてみてください。

 

なお、下記の方法で一時的なアドオンの無効化を試すことも可能です。

 

方法 1)

Windows キー + R キーで起動する [ファイル名を指定して実行] で、下記を実行することでアドオン無効モードで Internet Explorer を起動することができます。

 

iexplore.exe -extoff

 

このような画面で Internet Explorer が起動します。

方法 2)

Internet Explorer を起動し、[ツール] メニューの [アドオンの管理] 画面で、個別にアドオンを無効にすることができます。

左ペインで [ツール バーと拡張機能] を選択し、"表示" 欄で [すべてのアドオン] を選択します。

その後、右ペインで無効にしたいアドオンを選択し、画面右下に表示されている [無効にする] ボタンをクリックすることでアドオンを無効とすることができます。

無効にした後、Internet Explorer を再起動します。

 

サードパーティー製ソフトウェアをアンインストールする

Windows OS 上に、サードパーティー製のソフトウェアが導入されている場合、製品を一つずつアンインストールしていき、いずれかのソフトウェアの動作が影響していないかどうか確認しましょう。

 

なお、一部のソフトウェアでは、ソフトウェアが動作しないように “無効” とする設定がありますが、当該ソフトウェアが動作していない状態でも Internet Explorer が起動する際に自動的に読み込まれてしまうような DLL もあるため、可能な限りアンインストールを試してください。

 

サードパーティー製のソフトウェアをアンインストールして改善する場合には、当該のソフトウェアの動作が影響していると判断することができます。

この状況の場合には、ソフトウェアの開発元にお問い合わせしてみてください。

 

クリーンな環境で試す

アドオンやサードパーティー製のソフトウェアが多数あり、アンインストールでの切り分けが難しい場合、クリーンな環境を用意して試してみる、という方法もあります。

 

ここでいう「クリーンな環境」とは、Windows OS のインストール ディスクを利用して OS をインストールしただけの状態、もしくはその状態で Windows Update のみを実行した状態、です。

上述しているような、アドオンやサードパーティー製のソフトウェアが一切インストールされていない環境です。

 

クリーンな環境では現象が発生しない場合には、問題の発生する環境に導入しているアドオンやソフトウェアを一つずつインストールしていき、現象の変化ポイントを特定してください。

 

なお、有効期限付きですが、下記のサイトより Hyper-V や VMWare などの仮想環境上で利用可能な仮想 PC をダウンロードすることができます。

クリーンな環境のご用意が難しい場合には是非有効活用ください。

 

Download virtual machines
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

 

コンテンツを切り分ける

Internet Explorer において、一般的にメモリー使用量が増加する可能性のあるものとして、下記の情報が公開されています。問題の発生する Web コンテンツにおいて、このような仕組みとなっている個所がないか確認してください。

 

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

 

また、問題の発生する Web コンテンツの編集が可能である場合、現象の再現に必要な部分のみを抽出することができないか確認してください。

具体的には、現象の再現に必要のない下記のような要素を少しずつ削除する作業を繰り返します。

 

a) html ドキュメント内のタグを減らす
b) 画像や動画、音声ファイルを削除する
c) スタイルを外す (外部ファイルとしているスタイルシート、およびコンテンツ内で直接指定しているスタイル)
d) スクリプトを外す (外部ファイルとしている JavaScript や VBScript、およびコンテンツ内に直接記載しているスクリプト)

 

特に jQuery などのライブラリを利用している場合、当該ライブラリを読み込むだけでメモリー使用量が増加するため (ライブラリ内の処理が非常に複雑であることに起因します)、ライブラリを利用しない構成でも再現するかどうかご確認ください。

 

問題の発生ポイントが特定できた場合、上記の資料に記載の構成となっていないか改めて確認してください。

 

こちらも併せてご確認ください。

 

今日からできる!再現サンプルを作成しよう!
https://blogs.technet.microsoft.com/jpieblog/2014/07/23/59/

 

第一回の記事は以上となります。

少しでも問題解決のお役に立ちましたら幸いです。