アプリケーションプログラムにおける潜在的エラー状態を予測するためのコンピュータ実行方法であって、1つまたは複数のコンピュータ上で、前記アプリケーションプログラムによって開始されたリソースアクセスイベントをログに記録するオペレーションと、前記ログに記録されたリソースアクセスイベントからリソースアクセスパターンを確立するオペレーションと、前記アプリケーションプログラムによる前記確立されたリソースアクセスパターンからの逸脱を検出するオペレーションと、前記検出された逸脱に基づき潜在的エラー状態について前記アプリケーションプログラムのユーザーまたは管理者にアラートを発するオペレーションとを実施する命令を実行するステップを含むことを特徴とするコンピュータ実行方法。前記アプリケーションプログラムによりデータを追加、修正、または削除するためのリソースAPIsへのコールで指定されたパラメータ値からのデータをログに記録するステップをさらに含むことを特徴とする請求項1に記載のコンピュータ実行方法。アプリケーションの障害が発生した後に前記アプリケーションプログラムのアプリケーション状態を復元することを目的としてデータを追加、修正、または削除するために対応するリソースアクセスイベントを再現するために前記リソースAPIsへのコールで指定されたパラメータ値からの前記ログに記録されているデータを使用するステップをさらに含むことを特徴とする請求項2に記載のコンピュータ実行方法。前記リソースアクセスパターンは、ベイジアン学習技術を利用して前記ログに記録されているリソースアクセスイベントから確立されることを特徴とする請求項1に記載のコンピュータ実行方法。前記リソースアクセスパターンは、前記リソースアクセスイベントの間の相対的出現確率を示すマルコフ連鎖または確率の木として格納されることを特徴とする請求項4に記載のコンピュータ実行方法。前記確立されたリソースアクセスパターンからの前記逸脱を検出するステップは、前記リソースアクセスパターンのベイジアン解析結果に基づき指定された閾値確率より低い出現確率を有するリソースアクセスイベントのシーケンスを検出するステップを含むことを特徴とする請求項4に記載のコンピュータ実行方法。前記リソースアクセスパターンのベイジアン解析結果に基づき閾値確率より低い出現確率を有するリソースアクセスイベントのシーケンスは、前記エラー状態の発生時刻との時間的な近さに基づき前記アプリケーションプログラムの検出されたエラー状態と相関することを特徴とする請求項4に記載のコンピュータ実行方法。コンピュータ実行可能命令で符号化されたコンピュータ可読記憶媒体であって、前記コンピュータ可読記憶媒体はコンピュータによって実行されたときに前記コンピュータに、前記コンピュータ上で実行されるアプリケーションプログラムによるリソースへのアクセスを監視するステップと、前記アプリケーションプログラムによって開始されたリソースアクセスイベントをリソースアクセスログに記録するステップと、コンピュータパターン認識技術を使用して前記ログに記録されたリソースアクセスイベントからリソースアクセスパターンを確立するステップと、前記アプリケーションプログラムによる前記確立されたリソースアクセスパターンからの逸脱を検出するステップと、前記検出された逸脱に基づき潜在的エラー状態について前記アプリケーションプログラムのユーザーまたは管理者にアラートを発するステップとを実行させることを特徴とするコンピュータ可読記憶媒体。前記コンピュータに、前記アプリケーションプログラム内のエラー状態を検出するステップと、前記エラー状態の発生時刻を判定するステップと、前記エラー状態の前記発生時刻への時間的な近さに基づき前記リソースアクセスログ内の前記ログに記録されたリソースアクセスイベントのうちの1つまたは複数の相関を求めるステップと、前記1つまたは複数の相関するリソースアクセスイベントを前記アプリケーションプログラムのユーザーまたは管理者に表示するステップとを実行させる更なるコンピュータ実行可能命令で符号化されることを特徴とする請求項8に記載のコンピュータ可読記憶媒体。前記1つまたは複数の相関するリソースアクセスイベントは、前記確立されたリソースアクセスパターンのベイジアン解析結果に基づき閾値確率より低い出現確率を有するリソースアクセスイベントのシーケンスを含むことを特徴とする請求項9に記載のコンピュータ可読記憶媒体。本明細書でなされている開示は、以上の考慮事項および他の考慮事項に関して提示される。本明細書では、アプリケーションの障害を予測し、診断し、障害から復旧するためにアプリケーションプログラムの正常なオペレーションをエラー状態と区別する技術について説明する。アプリケーションプログラムが仮想アプリケーション環境内で実行されている場合、仮想化レイヤまたは仮想アプリケーション環境は、データファイルからの読み込み、レジストリキーへの書き込み、および同様の作業などの、アプリケーションがリソースに対して行う要求を認識し、制御することができる。本明細書で説明されている技術を利用することで、仮想化レイヤは、リソースへのアクセスをログに記録し、時間の経過とともに、リソース使用の共通パターンを確立することができる。このようなリソースアクセスパターンが確立された後、仮想化レイヤは、アプリケーションプログラムによるリソース使用を監視し続けて、パターンが変化したときに警告またはアラートを発することができる。この予防的警告は、アプリケーションプログラムのユーザーまたは管理者に、診断または是正処置を素早く講じる機会を与え、それにより、中断時間およびデータ喪失を低減し、また回避することさえ可能である。アプリケーションプログラムが典型的には、ポップアップダイアログや、アプリケーションログまたはシステムイベントログに記録されたイベントのように、ユーザーまたは管理者にエラーを表示する手段を有することは理解されるであろう。しかし、これらのエラーメッセージの質および有用性は、アプリケーション毎に劇的に異なりうる。エラーの発生源を特定できる高品質のエラーメッセージを提供するには、著しい投資を必要とし、すべてのソフトウェアベンダーがこの投資を行えるわけではない。本明細書で説明されているリソースへのアクセスおよび確立されている共通パターンのログを利用してどのリソースがアクセスされていたか、またはエラー状態の発生直前にパターンがどのように変化したかの相関を求めることにより、ユーザーおよび/または管理者は、アプリケーションの障害をより素早く診断し、復旧処置を実施し、アプリケーション中断時間を短縮することができる。それに加えて、仮想化レイヤは、アプリケーションプログラムによるすべてのリソース使用を認識しているので、これは、リソースの追加、修正、または削除を時間の経過とともに生じるこれらのリソースの修正において使用されるデータとともにログに記録することができる。アプリケーションプログラムに障害が生じた場合、アプリケーションプログラムの第2のインスタンスは、即時開始され、リソース修正およびデータのログが再現され、それにより、アプリケーションの状態をそのアプリケーションの第1のインスタンスの障害が発生した直前の時点に復元することができる。アプリケーションインスタンス間のこのような高速フェイルオーバーによって中断時間をさらに制限することができる。いくつかの実施形態によれば、仮想アプリケーション環境で実行されているアプリケーションプログラムによるリソースへのアクセスは、監視され、リソースアクセスイベントがリソースアクセスログに記録される。リソースアクセスパターンは、コンピュータパターン認識技術を利用してログに記録されているリソースアクセスイベントから確立される。アプリケーションプログラムによるその後のリソースへのアクセスが確立されたパターンから逸脱している場合、アプリケーションプログラムのユーザーおよび/または管理者は、検出された逸脱に基づき潜在的エラー状態の通知を受ける。さらに、確立されたリソースアクセスパターンから逸脱するリソースアクセスイベントのシーケンスとエラー状態との相関をエラー状態の発生時刻との時間的な近さに基づき決定し、エラーに関する診断情報をユーザーおよび/または管理者に提供することができる。最後に、リソースアクセスログに記録されたデータの追加、修正、または削除に関するリソースアクセスイベントは、アプリケーションの障害およびアプリケーションのその後の再起動の際に再現され、アプリケーションプログラムのアプリケーション状態が再確立されることができる。上述の本発明対象は、コンピュータ制御装置、コンピュータプロセス、コンピューティングシステム、またはコンピュータ可読媒体などの製造品として実装されうることは理解されるであろう。これらおよび他のさまざまな特徴は、以下の詳細な説明を読み、関連する図面を精査することで明らかになる。この課題を解決するための手段では、以下の発明を実施するための形態でさらに説明される簡素化された形式の概念の選択を導入する。この課題を解決するための手段は、請求されている主題の鍵となる特徴または本質的特徴を明示することを意図しておらず、またこの課題を解決するための手段は、請求されている発明対象の範囲を制限するために使用されることも意図していない。さらに、請求されている発明対象は、本開示の任意の部分において明記されているどれか、またはすべての不利点を解決する実装に限定されることはない。以下の詳細な説明は、アプリケーションの障害を予測し、診断し、および/または障害から復旧するためにリソースアクセスのパターンに基づきアプリケーションプログラムの正常なオペレーションをエラー状態と区別するための技術を対象とする。本明細書で説明されている発明対象は、コンピュータシステム上のオペレーティングシステムおよびアプリケーションプログラムの実行と併せて実行されるプログラムモジュールの一般コンテキストにおいて提示されているが、当業者であれば、他の実装を他のタイプのプログラムモジュールと組み合わせて実行することも可能であることを理解するであろう。一般に、プログラムモジュールは、特定のタスクを実行するか、または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造、および他の種類の構造を含む。さらに、当業者であれば、本明細書で説明されている発明対象は、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラム可能な家電製品、ミニコンピュータ、メインフレームコンピュータ、および同様のものを含む、他のコンピュータシステム構成を使用して実施できることを理解するであろう。以下の詳細な説明では、説明の一部をなす、特定の実施形態または例を図解で示す、添付図面を参照する。添付図面中、類似の番号は複数の図を通して類似の要素を表している。図1は、本明細書で提示されている実施形態による、アプリケーションの障害を予測し、診断し、障害から復旧するためにアプリケーションプログラムの正常なオペレーションをエラー状態と区別するための複数のソフトウェアコンポーネントを含む例示的なオペレーティング環境100を示している。環境100は、コンピュータ102を含む。コンピュータ102は、サーバーコンピュータ、デスクトップワークステーション、ラップトップ、またはノートブックなどのパーソナルコンピュータPC、携帯情報端末PDA、ワイヤレス電話機、セットトップボックス、ゲーム機、またはアプリケーションプログラムを実行することができる他の任意のコンピューティングデバイスとすることができる。ソフトウェアアプリケーションプログラム104は、コンピュータ102上で実行される。いくつかの実施形態によれば、アプリケーションプログラム104は、仮想アプリケーション環境106内で実行されうる。仮想アプリケーション環境106では、コンピュータ102が、コンピュータにこれまでにインストールされていないアプリケーションプログラムを起動し、実行することを許すことができる。その代わりに仮想アプリケーション環境106が、アプリケーションプログラム104のコンポーネントを仮想アプリケーションサーバー112からネットワーク110経由でアプリケーションプログラム104のコンポーネントをリアルタイムまたはほぼリアルタイムでストリーミング実行することができる。仮想アプリケーション環境106および仮想アプリケーションサーバー112は、ワシントン州レドモンド所在のMICROSOFTCorporation社のMICROSOFT登録商標APP-V技術、フロリダ州フォートローダーデール所在のCITRIXSYSTEMSInc.社のCITRIXXENAPP商標技術、または他のアプリケーションストリーミングおよび仮想化プラットフォームまたは技術に基づくものとしてよい。ネットワーク110は、LAN、ワイドエリアネットワークWAN、インターネット、またはコンピュータ102を仮想アプリケーションサーバー112に接続する他のネットワーキングトポロジーとすることができる。アプリケーションプログラム104のソフトウェアコンポーネントは、仮想アプリケーションサーバー112によってアクセス可能な記憶装置上に配置される仮想化されたアプリケーションパッケージ114内に格納することができる。いくつかの実施形態によれば、仮想化されたアプリケーションパッケージ114は、アプリケーションプログラムの構造情報さらにはアプリケーションの個別のコンポーネントファイルおよび他の要素を含むデータの多数のブロックからなる。仮想化されたアプリケーションパッケージ114は、実行時にアプリケーションプログラム104によって利用されるローカルリソースおよびリモートリソースの場所および構成に関するメタデータをさらに格納することができる。仮想化されたアプリケーションパッケージ114は、管理サーバー上でアプリケーションの標準のインストールを実行し、例えばローカルファイルシステム、レジストリ、および他のものに加えられた変更を記録することによってアプリケーションプログラム104の管理者が作成することができる。次いで、仮想化されたアプリケーションパッケージ114内のブロックを仮想アプリケーション環境106へストリーミング実行し、これにより、アプリケーションプログラム104をコンピュータ102上で実行することができる。仮想アプリケーション環境106は、アプリケーションサンドボックスと称される独立した仮想実行時環境を作成し、仮想アプリケーションサーバー112からストリーミングされるそれぞれのアプリケーションプログラム104を実行することができる。アプリケーションサンドボックスでは、アプリケーションプログラム104のコンポーネントをシステムの残り部分から隔離して実行することができる。仮想アプリケーション環境106は、実行時にアプリケーションプログラム104によって使用されるローカルリソース118Aおよびリモートソース118B本明細書では一般的にリソース118と称するへのアクセスを抽象化する仮想化レイヤ116をさらに備えることができる。リソース118は、システムメモリ、ローカルプロセッサの時間または処理スレッド、ファイルシステム内に格納されているファイル、レジストリデータベース内に格納されているデータ、アプリケーションサービス、プレゼンテーションサービス、データベースサービス、およびコンピュータ102によってローカルで利用できる、またはネットワーク110経由でリモートから利用できる同様のものを含みうる。アプリケーションプログラム104は、オペレーティングシステム122に実装されているリソースアプリケーションプログラミングインターフェースリソースAPIs120またはコンピュータ102上にインストールされている他の標準ソフトウェアライブラリを通じてローカルおよびリモートのリソース118にアクセスすることができる。いくつかの実施形態によれば、仮想化レイヤ116では、仮想アプリケーション環境106内で実行されているアプリケーションプログラム104によるローカルおよびリモートのリソース118へのアクセス要求を監視し、制御するためにリソースAPIs120を抽象化している。それに加えて、仮想化レイヤ116は、リソースアクセスログ124にアプリケーションプログラム104によるリソース118へのアクセスを記録することができる。リソースアクセスログ124は、ローカルファイルシステム内のログファイル、リモートデータベースサーバー上の多数のデータベーステーブル、これら2つの組み合わせ、またはコンピュータ102によってアクセス可能な他のデータ記憶システムを含むことができる。リソースアクセスログ124は、リソースアクセスイベント126のログを含みうる。リソースアクセスイベント126は、仮想アプリケーション環境106において実行されているアプリケーションプログラム104によって行われるリソースAPIs120へのコールの詳細を含みうる。リソースアクセスイベント126のそれぞれは、リソースアクセスが実行された日時を示すタイムスタンプ、呼び出された個別のリソースAPIs120の識別子、およびアクセスされているローカルまたはリモートのリソース118のリソースタイプ、場所、または他の態様を示す多数のパラメータ値を含みうる。リソースアクセスイベント126は、ログファイル内にエントリとして、データベーステーブル内に行として、ディクショナリ内にオブジェクトとして、または当技術分野で知られている他のデータ構造またはフォーマットで格納されうる。一実施形態において、リソースアクセスログ124は、リソースアクセスパターン128をさらに含む。リソースアクセスパターン128は、定期的に実行されるアプリケーションプログラム104によるリソースアクセスのパターンを含むものとしてよい。例えば、アプリケーションプログラム104は、時刻T1において特定のレジストリキーを読み込み、次いで、時刻T1240m秒においてリモートファイルシステム上に配置されている特定のファイルに書き出すことができる。さらに、レジストリキーを読み込み、ファイルに書き出すパターンは、例えば、特定のイベントまたは条件に応答して、定期的に、または特定の時刻に複数回発生しうる。リソースアクセスパターン128は、特定のAPIsコールとAPIsコールとの間で、特定のリソースに対するAPIsコールとAPIsコールとの間で、または例えば、割り当てられているメモリの量や、起動されたスレッドの数などの、リソースの特定の量に対するAPIsコールとAPIsコールとの間で確立されうる。リソースアクセスパターン128は、パターン認識技術を使用してある期間にわたって収集されたリソースアクセスイベント126から確立されうる。例えば、イベントタイプの部分集合が重要であると判定され、ベイズ学習技術を使用することで、収集期間内においてこれらのタイプのリソースアクセスイベント126にわたってリソースアクセスパターン128を確立することができる。生成されるリソースアクセスパターン128は、例えばリソースアクセスイベントの間の相対的出現確率を示すマルコフ連鎖または確率の木として格納されうる。一実施形態によれば、リソースアクセスパターン128は、アプリケーションプログラム104の実行と並行して実行するバックグラウンドプロセスにおいてリソースアクセスイベント126のログからコンピュータ上にほぼリアルタイムで生成されうる。別の実施形態では、仮想アプリケーション環境106内でアプリケーションプログラム104を実行する多数のコンピュータ102上で仮想化レイヤ116によってログに記録されたリソースアクセスイベント126は、中央のロケーションに集約することができる。集約されたイベントデータは、例えば、コンピュータ依存リソース経路を取り除くことによってジェネリック化され、リソースアクセスパターン128は、集約され、ジェネリック化されたイベントデータから確立されうる。次いで、生成されたリソースアクセスパターン128を、図2に関して以下でさらに詳しく説明されるように、アプリケーションの障害を予測する際にパターンを使用するためにアプリケーションプログラム104を実行するコンピュータ102のそれぞれに送ることができる。さらなる実施形態では、リソースアクセスログ124は、リソース書き出しデータ130をさらに含む。リソース書き出しデータ130は、レジストリ値書き出しまたはI/Oバッファ書き出しなどのデータを追加、修正、または削除する、リソースAPIs120へのアプリケーションプログラム104によるコールのログを含むものとしてよい。リソース書き出しデータ130は、書き出されるデータを含むようにポインタまたは構造型のパラメータからのディープコピーを含むことができる。それに加えて、任意のファイル名、キー名、アドレス、または他のロケーションパラメータを、実行中のアプリケーションプログラム104の現在のコンテキストを使用してジェネリック化することができる。リソース書き出しデータ130およびリソースアクセスイベント126は、単一のログファイル内に統合されるか、またはリソースアクセスログ124内の他の構造に統合されうる。リソース書き出しデータ130を使用することで、図4に関して以下でさらに詳しく説明されるように、アプリケーションの障害から復旧する際にアプリケーションプログラム104のアプリケーション状態を復元することができる。次に図2~4を参照して、本明細書で提示されている実施形態に関する追加の詳細が示される。図2~4に関して説明されている論理的なオペレーションは、1コンピュータシステム上で実行される一連のコンピュータ実装活動またはプログラムモジュールとして、および/または2コンピューティングシステム内の相互接続された機械論理回路または回路モジュールとして実装されることは理解されるであろう。この実装は、コンピューティングシステムの性能および他の要件に応じて選択できるものである。したがって、本明細書において説明されている論理的なオペレーションは、演算、構造的デバイス、活動、またはモジュールとさまざまに称される。これらの演算、構造的デバイス、活動、およびモジュールは、ソフトウェア、ファームウェア、専用デジタル論理回路、およびこれらの任意の組み合わせで実装されうる。図に示され、本明細書で説明されているものより、実行されうるオペレーションの数を増減できることも理解されるであろう。これらのオペレーションは、説明されているのと異なる順序で実行することもできる。図2は、本明細書で説明されている実施形態による、リソースアクセスの確立されたパターンからの逸脱に基づきアプリケーションプログラム104における潜在的エラー状態を予測するためのルーチン200を例示している。ルーチン200は、コンピュータ102上の仮想アプリケーション環境106において実行される仮想化レイヤ116および/またはコンピュータ上で、または集中型アプリケーションサーバー上で実行される他のモジュールの組み合わせによって実行されうる。ルーチン200は、他のコンピューティングデバイス上で実行している他のモジュールもしくはコンポーネントによって、またはモジュール、コンポーネント、およびコンピューティングデバイスの任意の組み合わせによって実行することもできる。ルーチン200は、オペレーション202から始まり、そこで、仮想化レイヤ116が仮想アプリケーション環境106において実行しているアプリケーションプログラム104によるローカルおよびリモートのリソース118へのアクセスを監視し、へのこれらのアクセスをリソースアクセスログ124にログとして記録する。図1に関して上で説明されているように、仮想化レイヤ116は、リソースAPIs120へのアプリケーションプログラム104によるコールの詳細を、リソースアクセスが実行された日時を示すタイムスタンプ、呼び出された個別のリソースAPIs120の識別子、およびアクセスされているローカルもしくはリモートのリソース118のリソースタイプ、ロケーション、または他の態様を示す多数のパラメータ値を含むリソースアクセスイベント126としてログに記録することができる。オペレーション202から、ルーチン200はオペレーション204に進み、そこで、リソースアクセスパターン128を確立する。ある期間にわたって、著しい数のリソースアクセスイベント126が仮想化レイヤ116によってリソースアクセスログ124にログとして記録されうることは理解されるであろう。図1に関して上で説明されているように、仮想化レイヤ116またはある種の他のモジュールもしくはプロセスは、ログに記録されているリソースアクセスイベント126を使用して、リソースアクセスパターン128を確立することができる。例えば、仮想化レイヤ116は、ベイジアンネットワークなどのパターン認識技術を使用して、2つまたはそれ以上のリソースアクセスイベントの間の相対的出現確率を確立することができる。次いで、確立されたリソースアクセスパターン128をマルコフ連鎖または確率の木としてリソースアクセスログ124に格納することができる。リソースアクセスパターン128は、仮想化レイヤ116によってコンピュータ102上にほぼリアルタイムで生成されうる。あるいは、ログに記録されているリソースアクセスイベント126を中央ロケーションで多数のコンピュータ102から集約し、ジェネリック化して使用することで、複数のコンピュータにまたがって仮想アプリケーション106内で実行しているアプリケーションプログラム104の複数のインスタンス上でリソースアクセスパターン128を確立することができる。次いで、本明細書で説明されている方法で、集約されたリソースアクセスイベント126から確立されたジェネリックなリソースアクセスパターン128を使用して、アプリケーションプログラム104を実行している任意のコンピュータ102上のエラー状態を予測することができる。ルーチン200は、オペレーション204からオペレーション206に進み、そこで、仮想化レイヤ116が仮想アプリケーション環境106内で実行しているアプリケーションプログラム104による確立されたリソースアクセスパターン128からの逸脱を検出する。例えば、仮想化レイヤ116は、リソースアクセスパターン128のベイジアン解析結果に基づき指定された閾値より低い出現確率を有するリソースAPIsコールのシーケンスを検出することができる。同様に、仮想化レイヤ116は、リソースアクセスパターン128において確立されているような、知られているエラー状態を伴う出現の確率が高いリソースAPIsコールのシーケンスを検出することができる。一実施形態において、このリソースAPIsコールのシーケンスの確率が特定の閾値以下にならない場合、仮想化レイヤ116は、リソースアクセスパターン128が上で説明されているバックグラウンドプロセスで新しい確率に更新されうるように対応するリソースアクセスイベント126をログに記録する。この方法で、リソースアクセスパターン128は、仮想アプリケーション環境106内でアプリケーションプログラム104の実行中に連続的に更新されうる。アプリケーションプログラム104による確立されたリソースアクセスパターン128からの逸脱が検出された場合、ルーチン200はオペレーション206からオペレーション208に進み、そこで、仮想化レイヤ116がこのパターンにおける逸脱に関するアラートを発する。アラートは、アプリケーションプログラム104のユーザーまたは管理者に向けることができる。アラートは、電子メール、テキストメッセージ、またはシステムメッセージキューを介して送信されるか、またはシステムレベルイベントとして発生するか、またはアプリケーションもしくはシステムイベントログに記録されるか、または他の何らかの形でコンピュータ102によってアクセス可能なメッセージングシステムを介して管理者に送信されうる。この予防的アラートは、管理者に診断または是正処置を素早く講じる機会を与えることができ、それにより、潜在的な保留エラー状態が生じた時点において中断時間およびデータ喪失を低減し、またおそらく回避することが可能である。オペレーション208から、ルーチンは終了する。図3は、本明細書で説明されている実施形態による、エラーの診断を行えるようにリソースアクセスイベント126とアプリケーションプログラム104における既知のエラー状態との相関を求めるためのルーチン300を例示している。ルーチン300は、コンピュータ102上の仮想アプリケーション環境106において実行される仮想化レイヤ116および/またはコンピュータ上で、あるいは集中型アプリケーションサーバー上で実行される他のモジュールの組み合わせによって実行されうる。ルーチン300は、他のコンピューティングデバイス上で実行している他のモジュールもしくはコンポーネントによって、またはモジュール、コンポーネント、およびコンピューティングデバイスの任意の組み合わせによって実行することもできる。ルーチン300は、オペレーション302から始まり、オペレーション202に関して上で説明されている方法で、仮想化レイヤ116が仮想アプリケーション環境106において実行しているアプリケーションプログラム104によるローカルおよびリモートのリソース118へのアクセスを監視し、リソースアクセスログ124にこれらのアクセスをログとして記録する。次いで、ルーチン300はオペレーション304に進み、アプリケーションプログラム104におけるエラー状態を検出する。例えば、ポップアップエラーダイアログ、アプリケーションもしくはシステムイベントログに記録されたイベント、または同様のものなどの、従来の手段を通じてアプリケーションのユーザーまたは管理者がアプリケーションプログラム104内のエラー状態を検出することができる。オペレーション304から、ルーチン300はオペレーション306に進み、そこで、リソースアクセスログ124内のリソースアクセスイベント126と検出されたエラー状態との相関を求める。管理者側でエラー状態の発生時刻を提示するか、またはエラー状態の発生時刻をリソースアクセスイベント126でログに記録されているリソースAPIs120への特定のコールから識別することができる。次いで、仮想化レイヤ116または他のモジュールは、エラー状態の発生時刻に時間的に近い範囲内にあるリソースアクセスログ124内のリソースアクセスイベント126の部分集合を識別することができる。例えば、エラー状態に至る10秒の時間枠内で発生したすべてのリソースアクセスイベント126は、このエラー状態と相関させることができる。一実施形態では、確立されたリソースアクセスパターン128から逸脱するエラー状態に時間的に近い範囲内のリソースアクセスイベント126でログに記録されたリソースAPIsコールのシーケンスのみとエラー状態との相関が求められる。例えば、仮想化レイヤ116または他のモジュールは、リソースアクセスログ124内のリソースアクセスパターン128のベイジアン解析結果に基づき特定の閾値より低い出現確率を有するエラー状態の発生の10秒以内にリソースアクセスイベント126でログに記録されたリソースAPIsコールのシーケンスを識別することができる。リソースアクセスパターン128における逸脱とエラー状態との相関に対する確率の指定された閾値は、オペレーション206に関して上で説明されているリソースアクセスパターンにおける逸脱に基づきエラー状態を予測することに対する確率の閾値より高い場合があることは理解されるであろう。次いで、ルーチン300は、オペレーション306からオペレーション308に進み、そこで、エラー状態と相関するリソースアクセスイベント126がアプリケーションプログラム104のユーザーまたは管理者に対して示される。相関するリソースアクセスイベント126は、ユーザーインターフェースダイアログを通じて、または電子メール、テキストメッセージ、システムメッセージキュー、もしくは同様のものを介して送信されるレポートで示されうる。特定のエラー状態と時間的に相関するリソースアクセスログ124からリソースアクセスイベント126を与えることで、ユーザーまたは管理者はエラー状態の原因を素早く診断し、適切な復旧処置を実施して中断時間を短縮し、データ喪失を低減することができる。オペレーション308から、ルーチン300は終了する。図4は、本明細書で説明されている実施形態による、アプリケーションプログラム104内のエラー状態から復旧するためのルーチン400を例示している。ルーチン400は、コンピュータ102上の仮想アプリケーション環境106において実行される仮想化レイヤ116および/またはコンピュータ上で、もしくは集中型アプリケーションサーバー上で実行される他のモジュールの組み合わせによって実行されうる。ルーチン400は、他のコンピューティングデバイス上で実行している他のモジュールもしくはコンポーネントによって、またはモジュール、コンポーネント、およびコンピューティングデバイスの任意の組み合わせによって実行することもできる。ルーチン400は、オペレーション402から始まり、オペレーション202に関して上で説明されている方法で、仮想化レイヤ116が仮想アプリケーション環境106において実行しているアプリケーションプログラム104によるローカルおよびリモートのリソース118へのアクセスを監視し、リソースアクセスログ124にこれらのアクセスをログとして記録する。それに加えて、仮想化レイヤ116は、図1に関して上で説明されているように、データを追加、修正、または削除するリソースAPIs120へのアプリケーションプログラム110によるコールに対するリソース書き出しデータ130をログに記録する。リソース書き出しデータ130は、APIsコールで指定されたポインタまたは構造型のパラメータからのディープコピーを含むことができ、このデータは、実行中のアプリケーションプログラム104の現在のコンテキストを使用してリソース書き出しデータ130におけるファイル名、キー名、アドレス、または他のロケーションパラメータをジェネリック化してさらに処理されうる。オペレーション402から、ルーチン400はオペレーション404に進み、そこで、アプリケーションプログラム104はエラー状態のため障害を発生する。例えば、アプリケーションプログラム104は、コードにバグがある、ユーザーが誤りを犯した、不正なデータを入力した、リソースが利用不可能である、コンピュータ102のハードウェアに障害が生じた、または同様の事態により障害を発生することがある。アプリケーションプログラム104が障害を発生した際、ルーチン400は、オペレーション406に移動し、そこで、アプリケーションプログラム104が再起動される。アプリケーションプログラム104は、コンピュータ102上で実行している仮想化レイヤ116または別のモジュールによって自動的に再起動されるか、または、同じコンピュータもしくは類似の構成を用いた別のコンピュータシステム上でシステム管理者によって手動で再起動されうる。ルーチン400はオペレーション406からオペレーション408に進み、そこで、アプリケーションプログラム104が再起動されたコンピュータ102上で仮想アプリケーション環境106において実行中の仮想レイヤ116が、アプリケーション状態を障害が発生する前の時点まで復元するためにリソースアクセスログ124内に記録されているいくつかのリソースアクセスイベント126を再現する。例えば、仮想化レイヤ116は、システムメモリアドレス、I/Oバッファ、キャッシュされたファイル、または同様のものなどの揮発性のもしくはキャッシュされた格納ロケーションに書き出すリソースAPIs120へのコールに対応するすべてのリソースアクセスイベント126を再現することができる。さらなる実施形態では、仮想化レイヤ116は、アプリケーションの障害が生じる前に仮想化レイヤおよび/またはアプリケーションプログラム104によってアプリケーション状態の最後のスナップショット、つまりチェックポイントが取られ、格納された以降に生じたデータの書き出しに対応するすべてのリソースアクセスイベント126を再現することができる。仮想化レイヤ116は、リソースアクセスログ124内のリソース書き出しデータ130を利用して、選択されたリソースアクセスイベント126を再現し、アプリケーション状態を復元する際に適切なデータを確実に書き出せるようにすることができる。アプリケーション状態を復元する書き出しを再現するために対応するリソース書き出しデータ130とともにデータを追加、修正、または削除するリソースアクセスイベント126をログに記録することで、アプリケーションの障害からの復旧を高速化することができ、したがってアプリケーションの中断時間を短縮できる。オペレーション408から、ルーチン400は終了する。本開示は、仮想化されたアプリケーション環境106を背景として説明されているが、アプリケーションプログラムの正常なオペレーションをエラー状態と区別してアプリケーションの障害を予測し、診断し、障害から復旧するための本明細書で取りあげられている方法は、ローカルおよびリモートのリソース118へのアプリケーションプログラム104によるアクセスを監視することができる他のアプリケーション環境で実施することができる。例えば、仮想アプリケーション環境106の外部のローカルで実行されるアプリケーションプログラム104によるローカルおよびリモートのリソース118に対する要求を監視するために当技術分野で知られている方法を使用してオペレーティングシステム122によって実行されるリソースAPIs120をフックする仮想化レイヤ116に類似するモジュールを実装することができる。モジュールは、リソースへのアクセスをログに記録し、アプリケーションプログラム104によるリソース使用の共通のパターンを確立することができる。このようなリソースアクセスパターンが確立された後、モジュールは、本明細書で説明されている方法で、アプリケーションプログラム104によるリソース使用を監視し続けて、パターンが変化したときに警告またはアラートを発することができる。図5は、本明細書で提示されている方法で、アプリケーションの障害を予測し、診断し、障害から復旧するためにアプリケーションプログラムの正常なオペレーションをエラー状態と区別するために本明細書で説明されているソフトウェアコンポーネントを実行することができるコンピュータ500のための例示的なコンピュータアーキテクチャを示している。図5に示されているコンピュータアーキテクチャは、従来のサーバーコンピュータ、デスクトップコンピュータ、ラップトップ、ノートブック、PDA、ワイヤレス電話機、または他のコンピューティングデバイスを例示しており、これを使用して、コンピュータ102または他のコンピューティングデバイス上で実行されるものとして説明されている本明細書で取りあげたソフトウェアコンポーネントの態様を実行することができる。図5に示されているコンピュータアーキテクチャは、1つまたは複数の中央演算処理装置CPU502を備える。CPU502は、コンピュータ500を動作させるために必要な算術演算および論理演算を実行する標準的なプロセッサとすることができる。CPU502は、一方の離散的な物理的状態から次の離散的な物理的状態へ、これらの状態を区別し、これらの状態を変更するスイッチング要素を操作することで遷移させることによって必要なオペレーションを実行する。スイッチング要素は、一般的に、フリップフロップなどの、2つの2値状態のうちの1つを維持する電子回路、および論理ゲートなどの、1つまたは複数の他のスイッチング要素の状態の論理的な組み合わせに基づき出力状態を与える電子回路を一般的に含みうる。これらの基本的なスイッチング要素を組み合わせることで、レジスタ、加算器/減算器、算術論理演算ユニット、浮動小数点演算ユニット、および他の論理要素を含む、より複雑な論理回路を形成することができる。コンピュータアーキテクチャは、ランダムアクセスメモリRAM514およびリードオンリーメモリROM516を含む、システムメモリ508と、メモリをCPU502に結合するシステムバス504とをさらに備える。起動時などにコンピュータ内の要素間の情報伝送を助ける基本ルーチンを含む基本入出力システムは、ROM516に格納される。コンピュータ500は、本明細書でより詳しく説明されている、オペレーティングシステム122、アプリケーションプログラム、および他のプログラムモジュールを格納するための大容量記憶装置510も備える。大容量記憶デバイス510は、システムバス504に接続されている大容量記憶装置コントローラ図示せずを通じてCPU502に接続されている。大容量記憶装置510は、コンピュータ500用の不揮発性記憶装置を構成する。コンピュータ500は、格納されている情報を反映するようにデバイスの物理的状態を変換することによって大容量記憶装置510に情報を格納することができる。物理的状態の特定の変換は、この説明の異なる実装におけるさまざまな要因に依存しうる。このような要因のいくつかの例として、限定はしないが、大容量記憶装置を実装するために使用される技術、大容量記憶装置が一次または二次記憶装置として特徴付けられるかどうか、および同様の要因が挙げられる。例えば、コンピュータ500は、大容量記憶装置コントローラに、磁気ディスクドライブ内の特定のロケーションの磁気特性、光学式記憶装置内の特定のロケーションの反射もしくは屈折特性、または半導体記憶装置内の特定のコンデンサ、トランジスタ、または他のディスクリートコンポーネントの電気的特性を変える命令を発行することによって大容量記憶装置510に情報を格納することができる。本発明の説明の範囲および精神から逸脱することなく、物理的媒体の他の変換が可能である。コンピュータ500は、大容量記憶装置内の1つまたは複数のロケーションの物理的状態または特性を検出することによって大容量記憶装置510から情報をさらに読み取ることができる。上で簡単に述べたように、コンピュータ500の大容量記憶装置510およびRAM514に、コンピュータのオペレーションを制御するのに適しているオペレーティングシステム518を含む、多数のプログラムモジュールおよびデータファイルを格納することができる。大容量記憶装置510およびRAM514には、1つまたは複数のプログラムモジュールを格納することもできる。特に、大容量記憶装置510およびRAM514には、図1に関して上で詳細に説明されている、仮想化レイヤ116を格納することができる。大容量記憶装置510およびRAM514には、他のタイプのプログラムモジュールまたはデータを格納することもできる。上で説明されている大容量記憶装置510に加えて、コンピュータ500は、プログラムモジュール、データ構造体、または他のデータなどの情報を格納し、取り出すために他のコンピュータ可読媒体にアクセスすることができる。当業者であれば、コンピュータ可読媒体は、コンピュータ可読記憶媒体および通信媒体を含む、コンピュータ500によってアクセス可能な利用可能な任意の媒体とすることができることは理解されるであろう。通信媒体は、一時的信号を含む。コンピュータ可読記憶媒体は、コンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータなどの情報を格納するための方法もしくは技術で実装される揮発性および不揮発性、取り外し可能および取り外し不可能媒体を含む。例えば、コンピュータ可読記憶媒体として、限定はしないが、RAM、ROM、EPROM、EEPROM、フラッシュメモリまたは他の半導体メモリ技術、CD-ROM、デジタル多用途ディスクDVD、HD-DVD、BLU-RAY登録商標、または他の光学式記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶装置、または所望の情報を格納するために使用することができ、しかもコンピュータ500によってアクセス可能な他の媒体が挙げられる。コンピュータ可読記憶媒体は、コンピュータ500にロードしたときに、コンピュータシステムを汎用コンピューティングシステムから本明細書で説明されている実施形態を実行することができる専用コンピュータに変換することができるコンピュータ実行可能命令により符号化されうる。コンピュータ実行可能命令は、媒体内の特定のロケーションの電気的、光学的、磁気的、または他の物理的特性を変化させることによってコンピュータ可読記憶媒体上に符号化されうる。これらのコンピュータ実行可能命令は、上で説明されているように、状態間でCPU502がどのように遷移するかを指定することによってコンピュータ500を変換する。一実施形態によれば、コンピュータ500は、コンピュータによって実行されたときに、図2~4に関して上で説明されている、アプリケーションの障害を予測し、診断し、障害から復旧するためにアプリケーションプログラムの正常なオペレーションをエラー状態と区別するルーチン200、300、および/または400を実行するコンピュータ実行可能命令を格納するコンピュータ可読記憶媒体にアクセスすることができる。さまざまな実施形態により、コンピュータ500は、LAN、WAN、インターネット、または当技術分野で知られているトポロジーのネットワークなどの、ネットワーク110を通じてリモートのコンピューティングデバイスおよびコンピュータシステムへの論理的接続を使用しネットワーク接続環境において動作することができる。コンピュータ500は、システムバス504に接続されているネットワークインターフェースユニット506を通じてネットワーク110に接続することができる。ネットワークインターフェースユニット506は、他の種類のネットワークおよびリモートコンピュータシステムに接続するために使用することもできることは理解されるであろう。コンピュータ500は、キーボード、マウス、タッチパッド、タッチスクリーン、電子スタイラス、または他のタイプの入力デバイスを含む、多数の入力デバイスから入力を受け取り、処理するための入出力コントローラ512を備えることもできる。同様に、入出力コントローラ512は、コンピュータモニタ、フラットパネルディスプレイ、デジタルプロジェクター、プリンター、プロッター、または他のタイプの出力デバイスへの出力を行うことができる。コンピュータ500は、図5に示されているコンポーネントのすべてを含むわけではないか、または図5に明示的に示されていない他のコンポーネントを含むか、または図5に示されているものと完全に異なるアーキテクチャを使用することができることは理解されるであろう。前記の説明に基づき、アプリケーションの障害を予測し、診断し、障害から復旧するためにアプリケーションプログラムの正常なオペレーションをエラー状態と区別する技術が本明細書に提示されていることは理解されるであろう。本明細書に提示されている発明対象は、コンピュータの構造的特徴、方法論的活動、およびコンピュータ可読記憶媒体に特有の用語を用いて説明されているが、付属の請求項で定められている発明は、本明細書で説明されている特定の特徴、活動、または媒体に必ずしも制限されないことは理解されるであろう。むしろ、特定の特徴、活動、および媒体は、請求項を実施する形態の例として開示されている。上で説明されている発明対象は、例示のみによって提示されており、制限として解釈すべきでない。例示され、説明されている実施形態および用途の例に従うことなく、また以下の請求項において述べられている、本発明の精神および範囲から逸脱することなく、本明細書で説明されている発明対象にさまざまな修正および変更を加えることができる。