(57)【要約】【課題】メモリリークが発生する条件を特定する技術を提供する。【解決手段】受け付けたリクエストを特定する識別子と対応付けて、実行された処理の履歴をリクエストトレース情報に格納し、受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、受け付けたリクエストと生成されるオブジェクトとの対応情報と、オブジェクト生成のトレース情報を記録し、生成されたオブジェクトの使用を終了したとき、リクエストとオブジェクトとの対応情報を削除し、オブジェクト開放のトレース情報を記録し、メモリリークを検出する指示を受け付けたとき、リクエストトレース情報から実行中のリクエストの一覧を取得し、実行中のリクエスト一覧に含まれず、かつ、リクエストとオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する。【選択図】図１
2008134709.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションサーバにおいて、受け付けたリクエストに基づいて実行された処理のメモリリークを検出する方法であって、
前記アプリケーションサーバは、インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、プログラム及びデータを格納する記憶装置と、を備え、
前記プロセッサは、
前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録し、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録し、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除し、前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録し、
前記アプリケーションサーバが、メモリリークを検出する指示を受け付けたとき、
前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、
前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する、ことを特徴とするメモリリーク検出方法。
【請求項２】
前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報は、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを管理するオブジェクト管理情報に記録される、ことを特徴とする請求項１に記載のメモリリーク検出方法。
【請求項３】
前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報は、前記受け付けたリクエストの処理の過程で生成されるオブジェクトに記録される、ことを特徴とする請求項１に記載のメモリリーク検出方法。
【請求項４】
前記プロセッサは、前記検出されたメモリリークの疑いのあるオブジェクトの一覧を表示する、ことを特徴とする請求項１に記載のメモリリーク検出方法。
【請求項５】
前記プロセッサは、
前記検出されたメモリリークの疑いのあるオブジェクトの選択を受け付け、
前記選択されたメモリリークの疑いのあるオブジェクトを生成したリクエストの一覧を表示する、ことを特徴とする請求項４に記載のメモリリーク検出方法。
【請求項６】
前記プロセッサは、
前記選択されたオブジェクトを生成したリクエストの選択を受け付け、
前記選択されたリクエストの履歴を、前記リクエストトレース情報から抽出し、
前記抽出されたリクエストの履歴を時系列順で表示する、ことを特徴とする請求項５に記載のメモリリーク検出方法。
【請求項７】
前記プロセッサは、前記メモリリークを検出する指示を受け付けた後、前記メモリリークの疑いのあるオブジェクトを検出する前に、他のオブジェクトから参照されていないオブジェクトを解放する処理を実行する、ことを特徴とする請求項１に記載のメモリリーク検出方法。
【請求項８】
前記プロセッサは、所定のタイミングで、
終了履歴が記録されたリクエストを、前記リクエストトレース情報から検索し、
処理が終了したリクエストとして検索されたリクエストであって、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に対応するオブジェクトが記録されていないリクエストを抽出し、
前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項１に記載のメモリリーク検出方法。
【請求項９】
前記プロセッサは、周期的に、前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項８に記載のメモリリーク検出方法。
【請求項１０】
前記プロセッサは、前記リクエストトレース情報として記録されたトレース情報の量が所定の値を超えたとき、前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項８に記載のメモリリーク検出方法。
【請求項１１】
実行された処理のメモリリークを検出するメモリリーク検出装置であって、
インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、プログラム及びデータを格納する記憶装置と、を備え、
業務処理を含んだリクエストを受け付けるリクエスト受付部と、
前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成、及び、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したときに前記使用を終了したオブジェクトの開放をリクエストトレース情報として記録するリクエストトレース部と、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストを特定する識別子と、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを特定する識別子と、の対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除するオブジェクト管理部と、
メモリリークを検出する指示を受け付けたとき、前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出するメモリリーク解析部と、を備えることを特徴とするメモリリーク検出装置。
【請求項１２】
受け付けたリクエストに基づいて処理を実行する計算機において、前記受け付けたリクエストに基づいて実行された処理のメモリリークを検出するプログラムであって、
前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録する手順と、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、
前記受け付けたリクエストを特定する識別子と、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを特定する識別子と、の対応情報を記録する手順と、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録する手順と、
前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、
前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除する手順と、
前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録する手順と、
前記計算機が、メモリリークを検出する指示を受け付けたとき、
前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得する手順と、
前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する手順と、を計算機に実行させることを特徴とするメモリリーク検出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリリークが発生した処理を実行したリクエストを特定し、メモリリークの発生原因を特定する技術に関する。
【背景技術】
【０００２】
近年、インターネット又はイントラネットを介し、主にＷｅｂベースのサービスを提供するシステムに対する要求が高まっている。このようなシステムを構築する場合、アプリケーションサーバとよばれるミドルウェアを使用し、アプリケーションサーバ上で動作するユーザアプリケーションを開発する手法が普及している。
【０００３】
アプリケーションサーバは、セキュリティ管理機能、トランザクション管理機能、リソースへのアクセス機能、コンポーネント管理機能などを提供する。このように、アプリケーションサーバを使用することによって、比較的容易に大規模かつ再利用性の高いシステムを構築することが可能となる。
【０００４】
アプリケーションサーバは、例えば、ユーザからのリクエストを受け付けて、指定された業務処理を実行する。アプリケーションサーバで実行されるユーザアプリケーションは、使用を終了したオブジェクトの解放を怠ると、アプリケーションサーバのメモリに領域を確保したまま残存する。そのため、時間の経過とともに、アプリケーションサーバ上で使用可能な空きメモリ空間が減少してしまう。このような現象は、メモリリークと呼ばれる。
【０００５】
アプリケーションサーバは、メモリリークが発生すると、最終的にはリクエストを処理するために必要なオブジェクトを生成できなくなるため、業務処理を継続することができなくなってしまう。特に、アプリケーションサーバは、複数のリクエストを効率的に処理するために、マルチスレッドで複数のユーザアプリケーションを実行する場合が多い。そのため、オブジェクトの解放を怠ったユーザアプリケーションだけではなく、アプリケーションサーバで実行される他のユーザアプリケーションがサービスを提供することが不可能になってしまうという問題がある。
【０００６】
また、アプリケーションサーバには、不要になったメモリ領域を自動的に解放するガーベジコレクションという機能が実装されている場合がある。しかし、ガーベジコレクションによってメモリを解放するシステムであっても、ユーザアプリケーションが使用を終了したオブジェクトの参照の解放を怠ると、メモリリークが発生してしまう。
【０００７】
さらに、ガーベジコレクションによってメモリを解放するシステムは、使用可能な空きメモリ空間が減少すると、アプリケーションサーバで実行されているすべてのスレッドを一旦停止させて解放可能なオブジェクトを探索する、フルガーベジコレクションを実行する。しかし、リークしたオブジェクトがすべて解放されるわけではないため、次第にフルガーベジコレクションが多発するようになってしまい、サービスのレスポンスタイムが長くなってしまうという問題が生じる。
【０００８】
前述のように、アプリケーションサーバで実行されるユーザアプリケーションにメモリリークが発生した場合、最終的にはサービスの継続が不可能になってしまう問題がある。そのため、ユーザアプリケーションにおいて、オブジェクト又はその参照を解放していない不具合があるためにメモリリークが発生した場合には、メモリリークの原因となっている不具合が発生する箇所及び不具合が発生する条件を迅速に特定することが重要となる。
【０００９】
メモリリーク及びその原因となる不具合の箇所を特定する方法は、従来より多種提案されている（例えば、特許文献１参照）。これらの方法を用いることによって、プロセス、ジョブ、又はスレッドごとに、解放されていないオブジェクトの種類及び量、当該オブジェクトを生成又は参照している箇所を特定することができる。
【００１０】
一方、アプリケーションサーバにおいて、リクエストのトレース情報を取得する方法が提案されている。トレース情報は、要求された業務処理を遂行するために実行された個々の処理の履歴を含む。例えば、リクエストの処理を開始した時点及び終了した時点、ユーザアプリケーションを構成するコンポーネントを呼び出した時点及び呼び出しから戻った時点、データベースなどのバックエンドシステムを呼び出した時点及び呼び出しから戻った時点など、リクエストを処理する過程での様々な情報が含まれる。
【特許文献１】特開平１１−２０３１９３号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
メモリリーク及びメモリリークの原因箇所を特定する従来の方法では、プロセス、ジョブ、又はスレッドごとに、解放されていないオブジェクトの種類及び量、当該オブジェクトを生成又は参照している箇所を特定することができる。
【００１２】
しかし、ユーザアプリケーションにおいて、ある特定の種類のリクエストを処理した場合、又はリクエストを処理するためにある特定の順序でプログラムを実行した場合など、特定の条件を満たした場合のみメモリリークが発生することがあった。従来の方法では、このようなメモリリークが発生する条件を特定することは困難であった。
【００１３】
本発明は、メモリリークが発生する条件、例えば、メモリリークを発生させるリクエスト、及びリクエストの処理順序などによってメモリリークが発生する条件などを特定する技術を提供する。
【課題を解決するための手段】
【００１４】
本発明の代表的な一形態では、アプリケーションサーバにおいて、受け付けたリクエストに基づいて実行された処理のメモリリークを検出する方法であって、前記アプリケーションサーバは、インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、を備え、前記プロセッサは、前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除し、前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録し、前記アプリケーションサーバが、メモリリークを検出する指示を受け付けたとき、前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する。
【発明の効果】
【００１５】
本発明の一形態によれば、アプリケーションの不具合によって、特定の条件でのみメモリリークが発生する場合であっても、メモリリークの発生条件を容易に特定することが可能となる。
【発明を実施するための最良の形態】
【００１６】
以下、本発明の実施の形態を図面に基づいて説明する。
【００１７】
図１は、本発明の実施の形態の計算機システムの装置構成の概要を示す説明図である。本発明の実施の形態の計算機システムでは、アプリケーションサーバ３０と端末１０がネットワーク２０を介して接続される。端末１０は、アプリケーションサーバ３０に指定された業務処理の実行を要求するリクエストを送信する。
【００１８】
アプリケーションサーバ３０は、通信装置５０、ＣＰＵ６０、入力装置７０、出力装置８０、記憶装置８５及びメモリ４０を備える。通信装置５０は、端末１０に接続されるネットワーク２０と接続する。ＣＰＵ６０は、メモリ４０に格納されたプログラムを実行する。
【００１９】
入力装置７０は、アプリケーションサーバ３０に必要な情報の入力を受け付ける装置である。例えば、ユーザからメモリリークの検出指示を受け付ける。出力装置８０は、アプリケーションサーバ３０から出力される情報を表示する。例えば、メモリリークの疑いのあるオブジェクトの検出結果を表示する。記憶装置８５は、プログラム及びプログラムの実行に必要なデータを格納する。記憶装置８５は、例えば、ハードディスクである。
【００２０】
メモリ４０は、リクエスト受付部１０１、プログラム群１０２、ユーザメモリ領域１０３、リクエストトレース部１０７、リクエストトレーステーブル１０８、オブジェクト管理部１０９、オブジェクトＩＤ管理部１１０、ＧＣ処理部１１１、オブジェクト管理テーブル１１２、ＵＩ１１３、メモリリーク解析部１１４、実行中リクエスト解析部１１５、及びリークオブジェクト解析部１１６を含む。なお、図中、太線で示された部分は、本発明の特徴的な構成を示している。メモリ４０に記憶されたプログラム及びデータは、あらかじめメモリ４０に記憶されていてもよいし、実行時に記憶装置８５から読み出して記憶してもよい。
【００２１】
リクエスト受付部１０１は、端末１０から送信されたリクエストを受け付け、コンテナプログラム１０４を実行する。また、リクエストの処理の開始及び終了などの履歴の出力を、リクエストトレース部１０７に依頼する。
【００２２】
プログラム群１０２は、コンテナプログラム１０４とユーザプログラム１０５などによって構成される。
【００２３】
ユーザメモリ領域１０３は、プログラム群１０２を構成するプログラムによって生成されたオブジェクト１０６を格納する。
【００２４】
コンテナプログラム１０４は、リクエスト処理におけるセキュリティ制御、トランザクション制御などを実行する。さらに、コンテナプログラム１０４は、ユーザプログラム１０５を実行する。
【００２５】
ユーザプログラム１０５は、業務処理を実行するためのユーザが作成したプログラムである。ユーザプログラム１０５は、受け付けたリクエストに従って、実際に業務処理を実行する。
【００２６】
また、ユーザプログラム１０５は、リクエストを処理するためにオブジェクトを使用する場合には、オブジェクト管理部１０９にオブジェクト生成を依頼し、ユーザメモリ領域に生成されたオブジェクト１０６を使用する。
【００２７】
さらに、ユーザプログラム１０５は、オブジェクト１０６の使用を終了した場合には、オブジェクト１０６に対するすべての参照を解放し、オブジェクト１０６をＧＣ処理部１１１によって解放可能な状態にしておく。ただし、ユーザプログラム１０５に不具合がある場合など、使用を終了したオブジェクト１０６の参照の解放を怠ると、ＧＣ処理部１１１は、オブジェクト１０６を解放することができないため、メモリリークが発生してしまう。
【００２８】
リクエストトレース部１０７は、リクエストのトレース情報を管理する処理部である。リクエストトレース部１０７は、リクエストトレーステーブル１０８にリクエストのトレース情報を格納する。
【００２９】
オブジェクト管理部１０９は、ユーザメモリ領域１０３のオブジェクト１０６を管理する処理部である。オブジェクト管理部１０９は、ユーザプログラム１０５からの要求を受け付け、要求されたオブジェクト１０６を生成する。また、ＧＣ処理部１１１の要求を受け付けて、オブジェクト１０６をユーザメモリ領域１０３から解放する。
【００３０】
オブジェクトＩＤ管理部１１０は、オブジェクト１０６とリクエストの対応を管理する処理部である。オブジェクトＩＤ管理部１１０は、オブジェクト管理部１０９からの依頼によって、オブジェクト１０６とリクエストとの対応をオブジェクト管理テーブル１１２に登録又は削除する。
【００３１】
ＧＣ処理部１１１は、ユーザメモリ領域１０３の空きメモリ領域が少なくなった場合に、ユーザメモリ領域１０３に格納されているオブジェクト１０６のうち、破棄可能なオブジェクトを抽出し、オブジェクト管理部１０９にオブジェクトの解放を依頼する。
【００３２】
ＵＩ１１３は、管理者からメモリリークの検出要求を受け付け、メモリリーク解析部１１４にメモリリークの検出を指示するユーザインタフェースである。なお、ＵＩ１１３は、ＧＵＩ（Graphical User Interface）又はＣＵＩ（Character_based User Interface）のいずれであってもよい。ＵＩ１１３は、ユーザからのメモリリーク検出指示を受け付け、メモリリークの疑いのあるオブジェクト一覧、リークの疑いのあるオブジェクトを生成したリクエスト一覧、及び指定されたリクエストのトレース情報を表示する。
【００３３】
メモリリーク解析部１１４は、ＵＩ１１３からメモリリークの解析を指示されると、まず、ＧＣ処理部１１１にフルガーベジコレクションを依頼する。そして、実行中リクエスト解析部１１５及びリークオブジェクト解析部１１６によって、リクエストが完了しているにもかかわらず、メモリから解放されていないオブジェクトの一覧であるリークオブジェクト一覧１１８を生成する。
【００３４】
実行中リクエスト解析部１１５は、リクエストトレーステーブル１０８に記憶されているトレース情報を参照し、リクエストが完了した旨が記録されていないリクエストの一覧である実行中リクエスト一覧１１７を生成する。
【００３５】
リークオブジェクト解析部１１６は、実行中リクエスト一覧１１７を参照し、オブジェクト管理テーブル１１２から、リクエストを実行中でないオブジェクトの一覧を取得する。すなわち、リクエストが完了しているにもかかわらず、参照が解放されておらず破棄されていないリークオブジェクト一覧１１８を生成する。
【００３６】
図２Ａは、本発明の実施の形態のリクエストトレーステーブル１０８の一例を示す説明図である。リクエストトレーステーブル１０８は、リクエストＩＤフィールド２０１及びイベントフィールド２０２を含む。
【００３７】
リクエストＩＤフィールド２０１は、端末１０から受け付けたリクエストを一意に識別するリクエストＩＤを格納する。リクエストＩＤは、リクエスト受付時にリクエストトレース部１０７によって生成される。イベントフィールド２０２は、リクエストを実行するための処理の処理ポイントを識別するイベント情報が時系列順に記録される。
【００３８】
リクエストトレーステーブル１０８に記録されるレコードは、受け付けたリクエストが処理されるとき、例えば、リクエストの処理開始及び終了、オブジェクトの生成及び削除などの処理ポイントごとに生成される。
【００３９】
図２Ｂは、本発明の実施の形態のオブジェクト管理テーブル１１２の一例を示す説明図である。オブジェクト管理テーブル１１２は、処理中のリクエストと当該リクエストの処理に伴って生成されたオブジェクトとの対応関係を格納する。オブジェクト管理テーブル１１２は、オブジェクトＩＤフィールド２１１及びリクエストＩＤフィールド２１２を含む。
【００４０】
オブジェクトＩＤフィールド２１１は、生成されたオブジェクトを識別するオブジェクトＩＤを格納する。オブジェクトＩＤは、オブジェクトを生成するとき、オブジェクトＩＤ管理部１１０によって生成される。
【００４１】
リクエストＩＤフィールド２１２は、リクエストトレーステーブル１０８のリクエストＩＤフィールド２０１と同じである。リクエストＩＤフィールド２１２は、オブジェクトＩＤフィールド２１１によって識別されるオブジェクトを生成したリクエストのリクエストＩＤを格納する。
【００４２】
アプリケーションサーバ３０は、オブジェクトが生成されるとき、生成されたオブジェクトを識別するオブジェクトＩＤと、リクエスト受付時にリクエスト受付部１０１によって生成されたリクエストＩＤとをオブジェクト管理テーブル１１２に記録する。なお、生成されたオブジェクトにリクエストＩＤを記録してもよい。
【００４３】
ここで、端末１０からリクエストを受け付けて、業務処理に必要なユーザプログラム１０５を実行し、オブジェクトが生成されてから解放されるまでの処理の概要を説明する。
【００４４】
受け付けたリクエストの処理は、大きく分けて、リクエスト開始処理、ユーザプログラム処理（オブジェクト生成処理）、及びリクエスト終了処理によって構成されている。
【００４５】
また、本発明の実施の形態では、ＧＣ処理部１１１によって、所定のタイミングでガーベジコレクションが実行され、使用を終了したオブジェクトがメモリから解放される。このとき、オブジェクト管理部１０９によって、ユーザプログラム処理（オブジェクト解放処理）が実行される。
【００４６】
図３Ａは、本発明の実施の形態のリクエスト処理時のオブジェクト管理の処理の流れを示す説明図である。各矢印に付された括弧付きの符号は、処理順序を示し、図３Ｂ及び図３Ｃに記載された各符号に対応する。
【００４７】
図３Ｂは、本発明の実施の形態のリクエスト処理時のオブジェクト生成時の処理の流れを示す説明図である。
【００４８】
まず、リクエスト開始処理について説明する。端末１０は、ネットワーク２０を介してアプリケーションサーバ３０に業務処理のリクエストを送信する（１）。
【００４９】
アプリケーションサーバ３０は、リクエスト受付部１０１によって、端末１０から送信されたリクエストを受信する。そして、リクエスト受付部１０１は、リクエストトレース部１０７にリクエスト処理の開始を通知する（２）。
【００５０】
リクエストトレース部１０７は、リクエストを一意に識別するリクエストＩＤを生成し、リクエストＩＤとリクエスト処理開始通知のイベントをリクエストトレーステーブル１０８に記録する（３）。
【００５１】
リクエストトレース部１０７は、以降、受信したリクエストに対するプログラムの処理において、端末１０にレスポンスを送信するまで、同一のリクエストＩＤを用いてリクエストトレーステーブル１０８にイベントを記録する。
【００５２】
次に、リクエスト受付部１０１は、コンテナプログラム１０４を起動する（４）。コンテナプログラム１０４は、ユーザプログラム１０５を起動するための前処理を実行した後、リクエストトレース部１０７にユーザプログラムの開始を通知する（５）。
【００５３】
リクエストトレース部１０７は、リクエストＩＤとユーザプログラム開始通知のイベントをリクエストトレーステーブル１０８に記録する（６）。
【００５４】
ここまでの処理が、リクエスト開始処理である。続いて、ユーザプログラム処理（オブジェクト生成処理）が実行される。
【００５５】
その後、コンテナプログラム１０４は、ユーザプログラム１０５を実行する。
【００５６】
ユーザプログラム１０５は、業務処理を実行し、必要に応じて、オブジェクト管理部１０９にオブジェクトの生成を依頼する（７）。
【００５７】
オブジェクト管理部１０９は、オブジェクト生成処理をフックし（８）、オブジェクトＩＤ管理部１１０の処理を実行する。オブジェクト生成処理をフックするとは、オブジェクト管理部１０９に対するオブジェクト生成依頼を検知し、オブジェクト管理部１０９がオブジェクト生成処理を開始する前に、オブジェクトＩＤ管理部１１０の処理を実行させることである。そして、オブジェクトＩＤ管理部１１０の処理が完了すると、オブジェクト生成依頼をオブジェクト管理部１０９に到達させ、処理を続行させる。
【００５８】
オブジェクトＩＤ管理部１１０は、オブジェクトごとに一意の識別子をオブジェクトＩＤとして割り当てる。そして、オブジェクトＩＤ管理部１１０は、オブジェクトの生成をリクエストトレース部１０７に通知する（９）。
【００５９】
リクエストトレース部１０７は、リクエストＩＤとオブジェクト生成通知のイベントをリクエストトレーステーブル１０８に記録する（１０）。
【００６０】
オブジェクトＩＤ管理部１１０は、その後、リクエストトレース部１０７からリクエストＩＤを取得し、生成したオブジェクトＩＤとともにオブジェクト管理テーブル１１２に記録する（１１）。
【００６１】
この後、オブジェクト管理部１０９は、ユーザメモリ領域１０３にオブジェクト１０６の生成に必要なメモリ領域を確保してオブジェクト１０６を生成し（１２）、ユーザプログラム１０５にオブジェクト１０６を送信する。
【００６２】
ここまでの処理が、ユーザプログラム処理（オブジェクト生成処理）である。続いて、リクエスト終了処理が実行される。
【００６３】
ユーザプログラム１０５は、オブジェクト１０６の使用を終了すると、オブジェクト１０６に対する参照を解放する。実行中のプログラム又はオブジェクトから参照されないオブジェクト１０６は、後述するオブジェクト解放処理によって、ユーザメモリ領域１０３から削除（解放）される。
【００６４】
ユーザプログラム１０５は、業務処理の実行が終了すると、コンテナプログラム１０４に制御を戻す。そして、コンテナプログラム１０４は、リクエストトレース部１０７にユーザプログラムの終了を通知する（１４）。
【００６５】
リクエストトレース部１０７は、ユーザプログラム１０５の終了が通知されると、リクエストＩＤとユーザプログラム終了通知のイベントをリクエストトレーステーブル１０８に記録する（１５）。
【００６６】
さらに、コンテナプログラム１０４は、ユーザプログラム１０５に対する後処理を実行した後、リクエスト受付部１０１に制御を戻し、処理を終了する（１６）。その後、リクエスト受付部１０１は、リクエストトレース部１０７にリクエストの終了を通知する（１７）。
【００６７】
リクエストトレース部１０７は、リクエストＩＤとリクエスト終了通知のイベントをリクエストトレーステーブル１０８に記録する（１８）。この後、リクエスト受付部１０１は、端末１０にレスポンスとしてユーザプログラム１０５の処理結果を送信する（１９）。
【００６８】
ここまでに説明した手順では、生成されたオブジェクト１０６をユーザメモリ領域１０３から解放する処理は含まれていないが、ガーベジコレクションが実装されていないシステムなどでは、ユーザプログラム１０５からオブジェクト管理部１０９にメモリ解放処理を依頼する。
【００６９】
また、ガーベジコレクションが実装されるシステムでは、ＧＣ処理部１１１によって、リクエスト処理と独立してオブジェクト解放処理が定期的又は非定期的に実行される。この場合には、ＧＣ処理部１１１がオブジェクト管理部１０９にオブジェクト解放処理を依頼する。
【００７０】
ここで、オブジェクト解放時の処理について説明する。
【００７１】
図３Ｃは、本発明の実施の形態のオブジェクト解放時の処理の流れを示す説明図である。オブジェクトの解放処理は、リクエスト処理においてユーザプログラム１０５によって明示的に実行される場合と、ＧＣ処理部１１１によって、リクエスト処理と独立して所定のタイミングで実行される場合がある。
【００７２】
オブジェクト解放処理は、オブジェクト管理部１０９が依頼を受け付けて実行される（ａ）。このとき、オブジェクトＩＤ管理部１１０は、オブジェクト解放処理の依頼をフックして処理を実行する（ｂ）。
【００７３】
ユーザプログラム１０５によって明示的にオブジェクト解放処理が実行される場合には、オブジェクトＩＤ管理部１１０は、リクエストトレース部１０７にオブジェクトの解放を通知する（ｃ）。そして、リクエストトレース部１０７は、オブジェクト解放通知のイベントをリクエストトレーステーブル１０８に記録する（ｄ）。
【００７４】
オブジェクトＩＤ管理部１１０は、解放済のオブジェクト１０６に対するオブジェクトＩＤをオブジェクト管理テーブル１１２から削除する（ｅ）。その後、オブジェクト管理部１０９は、実際にオブジェクト１０６が使用していたユーザメモリ領域１０３に確保されたメモリ領域を解放する（ｆ）。
【００７５】
続いて、端末１０からリクエストを受け付けて、業務処理に必要なユーザプログラム１０５を実行し、オブジェクトが生成されてから解放されるまでの処理の詳細を、図４から図７に示すフローチャートを用いて説明する。
【００７６】
図４は、本発明の実施の形態のリクエスト処理時のオブジェクト管理処理の手順を示すフローチャートである。
【００７７】
リクエスト受付部１０１は、まず、端末１０からネットワーク２０を介して送信されたリクエストを受け付ける (Ｓ４０１）。リクエストは、ユーザによって依頼された業務処理の実行要求である。リクエスト受付部１０１は、リクエストを受け付けると、リクエストトレース部１０７にリクエストの処理開始を通知する。
【００７８】
リクエストトレース部１０７は、リクエストの処理開始が通知されると、リクエストを一意に識別可能なリクエストＩＤを生成する。そして、生成されたリクエストＩＤとリクエスト処理開始通知のイベントとをリクエストトレーステーブル１０８に記録する（Ｓ４０２）。具体的には、生成されたリクエストＩＤを“１”とすると、リクエストＩＤ２０１を“１”、イベント２０２を「リクエスト処理開始」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０３）。
【００７９】
続いて、リクエスト受付部１０１は、コンテナプログラム１０４を実行する。コンテナプログラム１０４は、リクエストトレース部１０７にユーザプログラム１０５の処理開始を通知する。リクエストトレース部１０７は、ユーザプログラム１０５の処理開始が通知されると、ユーザプログラム処理開始通知のイベントを生成されたリクエストＩＤとともにリクエストトレーステーブル１０８に記録する（Ｓ４０３）。具体的には、実行されたユーザプログラムを「プログラム１」とすると、リクエストＩＤ２０１を“１”、イベント２０２を「プログラム１実行」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０４）。
【００８０】
コンテナプログラム１０４は、ユーザプログラム１０５を実行する（Ｓ４０４）。ユーザプログラム１０５で実行される処理については、図５にて後述する。
【００８１】
コンテナプログラム１０４は、ユーザプログラム１０５の処理が完了すると、リクエストトレース部１０７にユーザプログラム１０５の処理終了を通知する。そして、リクエストトレース部１０７は、ユーザプログラム終了通知のイベントを前述のリクエストＩＤとともにリクエストトレーステーブル１０８に記録する（Ｓ４０５）。具体的には、リクエストＩＤ２０１を“１”、イベント２０２を「プログラム１実行終了」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０７）。
【００８２】
その後、コンテナプログラム１０４の処理が完了すると、リクエスト受付部１０１に制御が戻される。そして、リクエスト受付部１０１は、リクエストトレース部１０７にリクエストの処理終了を通知する。リクエストトレース部１０７は、リクエストの処理が終了したことをリクエストＩＤとともにリクエストトレーステーブル１０８に記録する（Ｓ４０６）。具体的には、リクエストＩＤ２０１を“１”、イベント２０２を「リクエスト処理終了」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０８）。
【００８３】
最後に、リクエスト受付部１０１は、ユーザプログラム１０５の実行結果をレスポンスとして端末１０に送信する（Ｓ４０７）。
【００８４】
図５は、本発明の実施の形態のユーザプログラム処理の手順を示すフローチャートである。本フローチャートは、図４のフローチャートのＳ４０４の処理の詳細である。
【００８５】
ユーザプログラム１０５は、業務処理を実行する（Ｓ５０１）。そして、実行する処理に必要なオブジェクトを、必要となった時点で、オブジェクト管理部１０９にオブジェクトの生成を依頼する。
【００８６】
オブジェクト管理部１０９は、ユーザメモリ領域１０３にメモリ領域を確保し、オブジェクト１０６を生成する（Ｓ５０２）。そして、オブジェクト管理部１０９は、生成したオブジェクトをユーザプログラム１０５に送信する。
【００８７】
ユーザプログラム１０５は、生成されたオブジェクト１０６を用いて業務処理を継続する（Ｓ５０３）。ユーザプログラム１０５は、業務処理が完了し、オブジェクト１０６が不要になると、オブジェクト管理部１０９にオブジェクト１０６の解放を依頼する。
【００８８】
オブジェクト管理部１０９は、オブジェクト１０６の解放を依頼されると、オブジェクト１０６で使用したメモリ領域を解放する（Ｓ５０４）。このとき、ユーザプログラム１０５がＳ５０４のオブジェクト解放処理を実行しない場合には、メモリリークが発生してしまう。特に、ガーベジコレクションを備えない場合には、解放されないオブジェクト１０６は、ユーザメモリ領域１０３を占有し続けてしまうこととなる。
【００８９】
図６は、本発明の実施の形態のオブジェクト生成処理の手順を示すフローチャートである。本フローチャートは、図５のフローチャートのＳ５０２の処理の詳細である。
【００９０】
オブジェクト管理部１０９は、ユーザプログラム１０５からのオブジェクト１０６の生成を依頼されると、オブジェクト生成処理を開始する（Ｓ６０１）。このとき、オブジェクトＩＤ管理部１１０は、オブジェクト生成処理をフックして処理を実行する（Ｓ６０２）。
【００９１】
オブジェクトＩＤ管理部１１０は、生成されるオブジェクトを識別するオブジェクトＩＤを生成する（Ｓ６０３）。そして、オブジェクトの生成をリクエストトレース部１０７に通知する。
【００９２】
リクエストトレース部１０７は、オブジェクトの生成が通知されると、オブジェクト生成のイベントを生成されたオブジェクトのオブジェクトＩＤを明示して、リクエストＩＤとともにリクエストトレーステーブル１０８に記録する（Ｓ６０４）。具体的には、リクエストＩＤが“１”のリクエストがオブジェクトＣを生成する場合には、リクエストＩＤ２０１を“１”、イベント２０２を「オブジェクトＣ生成」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０５）。
【００９３】
オブジェクトＩＤ管理部１１０は、生成するオブジェクトのオブジェクトＩＤとリクエストトレース部１０７によって生成されたリクエストＩＤをオブジェクト管理テーブル１１２に記録する（Ｓ６０５）。具体的には、リクエストＩＤが“１”のリクエストがオブジェクトＡを生成した場合、図２Ｂに示すように、オブジェクトＩＤ２１１を“Ａ”、リクエストＩＤ２１２を“１”として、オブジェクト管理テーブル１１２に記録する（図２Ｂのレコード２１３）。
【００９４】
その後、オブジェクト管理部１０９は、ユーザメモリ領域１０３に領域を確保し、オブジェクト１０６を生成する（Ｓ６０６）。そして、生成されたオブジェクト１０６は、ユーザプログラム１０５に送信される（Ｓ６０７）。
【００９５】
図７は、本発明の実施の形態のオブジェクト解放処理の手順を示すフローチャートである。本フローチャートは、図５のフローチャートのＳ５０４の処理の詳細である。
【００９６】
オブジェクト管理部１０９は、ユーザプログラム１０５又はＧＣ処理部１１１からの要求によって、オブジェクト解放処理を開始する（Ｓ７０１）。オブジェクトＩＤ管理部１１０は、オブジェクト解放処理をフックして、処理を実行する（Ｓ７０２）。
【００９７】
オブジェクト解放処理がユーザプログラム１０５から要求された場合には（Ｓ７０３の結果が「Ｎｏ」）、リクエスト処理でオブジェクト解放処理が実行されるため、オブジェクトＩＤ管理部１１０は、リクエストトレース部１０７にオブジェクトの解放を通知する。
【００９８】
リクエストトレース部１０７は、オブジェクトの解放が通知されると、オブジェクト解放のイベントを解放されたオブジェクトのオブジェクトＩＤを明示して、リクエストＩＤとともにリクエストトレーステーブル１０８に記録する（Ｓ７０４）。具体的には、リクエストＩＤが“１”のリクエストがオブジェクトＣを解放する場合には、リクエストＩＤ２０１を“１”、イベント２０２を「オブジェクトＣ解放」として、リクエストトレーステーブル１０８に記録する（図２Ａのレコード２０６）。
【００９９】
一方、オブジェクト解放処理がＧＣ処理部１１１から要求された場合には（Ｓ７０３の結果が「Ｙｅｓ」）、オブジェクト解放処理はリクエスト処理に含まれないため、Ｓ７０４の処理は実行されない。
【０１００】
さらに、オブジェクトＩＤ管理部１１０は、解放されたオブジェクトのオブジェクトＩＤとリクエストＩＤの対応関係をオブジェクト管理テーブル１１２から削除する（Ｓ７０５）。さらに、オブジェクト管理部１０９は、オブジェクト１０６が使用していたメモリ領域を解放する（Ｓ７０６）。
【０１０１】
リクエストトレーステーブル１０８に記録されたオブジェクトの生成及び解放のトレース情報は、メモリリークの疑いのあるオブジェクトを検出し、メモリリークの原因を究明するための情報として利用される。
【０１０２】
続いて、リクエストトレーステーブル１０８及びオブジェクト管理テーブル１１２に記録された情報に基づいて、メモリリークの疑いのあるオブジェクトを検出する手順について説明する。
【０１０３】
図８は、本発明の実施の形態のメモリリークの検出処理の流れの概要を示す説明図である。図８の矢印に付されている括弧付きの符号は、処理の順序を示す。メモリリークの検出処理は、アプリケーションサーバ３０のＵＩ１１３から、ユーザの指示を受け付けて実行される。なお、説明の文末に付されている括弧付きの符号は、図８の矢印に付されている括弧付きの符号に対応する。
【０１０４】
ＵＩ１１３は、メモリリークの疑いのあるオブジェクト一覧（リークオブジェクト一覧１１８）の取得をメモリリーク解析部１１４に依頼する（１）。ここで、メモリリークの疑いのあるオブジェクトとは、オブジェクトを生成したリクエストが完了しているにもかかわらず、メモリから解放されていないオブジェクトのことである。
【０１０５】
なお、ガーベジコレクションによってオブジェクトが解放される場合には、メモリリーク解析部１１４は、オブジェクトの解放をＧＣ処理部１１１に依頼し、いずれのプログラム又はオブジェクトから参照されていないオブジェクトを解放する（２）。また、オブジェクトがユーザプログラム１０５によって明示的にメモリから解放される場合には、ガーベジコレクションによるオブジェクト解放処理を実行しなくてもよい。
【０１０６】
ＧＣ処理部１１１によるオブジェクトの解放が完了すると、メモリリーク解析部１１４は、実行中リクエスト解析部１１５に依頼し、実行中リクエスト一覧１１７を取得する（３）。実行中リクエスト一覧１１７とは、リクエストトレーステーブル１０８にリクエストの完了情報が記録されておらず、かつ、処理が完了していないリクエストの一覧である。実行中リクエスト一覧１１７を必要とする理由は、メモリリークの疑いのあるオブジェクトを検出する時点で、処理中のリクエストが生成したオブジェクトをリーク候補のオブジェクト一覧から除外する必要があるためである。実行中リクエスト解析部１１５は、リクエストトレーステーブル１０８を参照し（４）、実行中リクエスト一覧１１７を作成する。
【０１０７】
さらに、メモリリーク解析部１１４は、実行中リクエスト解析部１１５が生成した実行中リクエスト一覧１１７をリークオブジェクト解析部１１６に送信し、リークオブジェクト一覧１１８の取得を依頼する（５）。
【０１０８】
リークオブジェクト解析部１１６は、オブジェクトとリクエストを対応付けているオブジェクト管理テーブルを参照し、実行中リクエスト一覧１１７に含まれていないリクエストと対応付けられているオブジェクトを検索し、リークオブジェクト一覧１１８を作成する（６）。
【０１０９】
なお、オブジェクトにリクエストＩＤが記録されている場合には、リークオブジェクト解析部１１６は、ユーザメモリ領域１０３に存在するオブジェクトを検索することによって、リークオブジェクト一覧１１８を作成する。具体的には、ユーザメモリ領域１０３に存在するオブジェクトに記録されているリクエストＩＤと、実行中リクエスト一覧１１７に含まれるリクエストＩＤとが一致しないオブジェクトを抽出する。
【０１１０】
メモリリーク解析部１１４は、リークオブジェクト解析部１１６によって生成されたリークオブジェクト一覧１１８をＵＩ１１３に送信する。ＵＩ１１３は、リークオブジェクト一覧１１８に基づいて、画面上にメモリリークの疑いのあるオブジェクトの一覧を表示する。
【０１１１】
図９Ａは、本発明の実施の形態の実行中リクエスト解析部１１５によって生成される実行中リクエスト一覧１１７の一例を示す図である。
【０１１２】
実行中リクエスト一覧１１７は、メモリリークの疑いのあるオブジェクトを検出する時点で実行中であるリクエストを一意に識別するリクエストＩＤ２２１の一覧を格納するテーブルである。
【０１１３】
図９Ａを参照すると、リクエストＩＤが“２”であるリクエストが実行中であるため、実行中リクエスト一覧１１７にリクエストＩＤ“２”が格納されている。
【０１１４】
図９Ｂは、本発明の実施の形態のリークオブジェクト解析部１１６が生成するリークオブジェクト一覧１１８の一例を示す図である。
【０１１５】
リークオブジェクト一覧１１８は、メモリリークの疑いがあるオブジェクトを一意に識別するオブジェクトＩＤ２３１と、当該オブジェクトを生成したリクエストを一意に識別するリクエストＩＤ２３２の一覧を格納するテーブルである。
【０１１６】
図９Ｂを参照すると、オブジェクトＩＤ２３１が“Ａ”及び“Ｂ”であるオブジェクトがメモリリークの疑いがあり、これらのオブジェクトは、リクエストＩＤ２３２が“１”であるリクエストによって生成されたことがわかる。
【０１１７】
図１０は、本発明の実施の形態のメモリリーク検出プログラムのＧＵＩの構成の一例を説明する図である。
【０１１８】
画面３００は、ユーザからメモリリーク検出の指示を受け付ける画面である。画面３００は、メモリリーク検出の指示を受け付ける旨のメッセージ３１０と、メモリリーク検出を指示するボタン３１１とを含む。
【０１１９】
メモリリーク検出を指示するボタン３１１を操作することによってメモリリーク検出が指示されると、ＵＩ１１３は、前述のように、リークオブジェクト一覧１１８の取得をメモリリーク解析部１１４に依頼する。ＵＩ１１３は、メモリリーク解析部１１４からリークオブジェクト一覧１１８を取得すると、その内容を画面３０１に表示する。
【０１２０】
画面３０１は、メモリリークの疑いのあるオブジェクト一覧を表示する画面であり、リークの疑いのあるオブジェクト名及び個数の一覧を表示するテーブル３１２を表示する。テーブル３１２は、オブジェクトを選択するためのラジオボタンが配置されている。ラジオボタンを選択し、詳細表示ボタン３１３を操作することによって、選択されたオブジェクトを生成したリクエストの一覧を表示することができる。
【０１２１】
画面３０２は、画面３０１で選択されたオブジェクトを生成したリクエストＩＤの一覧を表示する。選択されたオブジェクトを生成したリクエストＩＤの一覧は、テーブル３１４によって表示される。テーブル３１４には、リクエストＩＤを選択するためのラジオボタンが配置されている。テーブル３１４に配置されたラジオボタンを選択し、トレース表示ボタン３１５を操作すると、選択されたリクエストＩＤによって識別されるリクエストのトレース情報を表示することができる。
【０１２２】
画面３０３は、画面３０２のラジオボタンで選択されたリクエストＩＤによって識別されるリクエストのトレース情報３１６を表示する。トレース情報３１６には、リクエスト処理開始及び終了、ユーザプログラム１０５の実行、オブジェクトの生成などが時系列順に表示される。
【０１２３】
図１１は、本発明の実施の形態のメモリリーク検出処理の手順を示すフローチャートである。本フローチャートは、ＵＩ１１３からの指示を受け付けて、メモリリークの疑いのあるオブジェクトの一覧を生成し、メモリリークの疑いのあるオブジェクトを生成したリクエストのトレース情報を表示するまでの処理内容を示している。また、図２Ａ及び図２Ｂに示されたリクエストトレーステーブル１０８及びオブジェクト管理テーブル１１２を用いて、具体例を説明する。なお、メモリリーク検出処理は、リクエストＩＤが“１”であるリクエストが終了した後に（図２Ａのレコード２０６）、実行されたものとする。
【０１２４】
ＵＩ１１３は、ユーザが画面３００のメモリリーク検出ボタン３１１を操作することによって、メモリリーク解析部１１４にリークオブジェクト一覧１１８の生成を依頼する（Ｓ８０１）。
【０１２５】
メモリリーク解析部１１４は、ユーザプログラム１０５によって明示的にオブジェクトが解放されるか否かを判定する（Ｓ８０２Ａ）。明示的にオブジェクトが解放されるシステムでない場合には（Ｓ８０２Ａの結果が「Ｎｏ」）、ＧＣ処理部１１１にフルガーベジコレクションの実行を依頼し、別のオブジェクトから参照されていないオブジェクトを解放する（Ｓ８０２Ｂ）。また、ユーザプログラム１０５によって明示的にオブジェクトが解放される場合には（Ｓ８０２Ａの結果が「Ｙｅｓ」）、オブジェクト解放処理を実行せずにＳ８０３の処理を実行してもよい。
【０１２６】
メモリリーク解析部１１４は、実行中リクエスト解析部１１５に、実行中リクエストの解析を依頼する。実行中リクエスト解析部１１５は、リクエストトレーステーブル１０８を参照し、リクエスト処理終了のトレースが記録されていない実行中リクエスト一覧１１７を生成する（Ｓ８０３）。
【０１２７】
ここで、図２Ａのリクエストトレーステーブル１０８を参照すると、前述のように、リクエストＩＤが“１”のリクエスト終了後に本処理が実行されているため、リクエスト処理が終了していない実行中リクエストは、リクエストＩＤが“２”のリクエストとなる。したがって、図９Ａに示すように、実行中リクエスト一覧１１７には、リクエストＩＤ２２１に“２”が格納されたレコード２２２が含まれている。
【０１２８】
メモリリーク解析部１１４は、Ｓ８０３の処理によって実行中リクエスト解析部１１５によって取得された実行中リクエスト一覧１１７をリークオブジェクト解析部１１６に送信する。リークオブジェクト解析部１１６は、オブジェクト管理テーブル１１２から現在実行中ではない（すなわち、すでに処理を完了している）リクエストによって生成されたオブジェクトの一覧（リークオブジェクト一覧１１８）を生成する（Ｓ８０４）。
【０１２９】
図９Ｂのリークオブジェクト一覧１１８を生成する手順を具体的に説明すると、リークオブジェクト解析部１１６は、まず、実行中リクエスト一覧１１７を参照し、実行中のリクエストのリクエストＩＤを特定する。図９Ａを参照すると、リクエストＩＤ２２１に“２”が格納されている。続いて、図２Ｂのオブジェクト管理テーブル１１２から、実行中リクエスト一覧１１７に含まれていないリクエストによって生成されたオブジェクト、すなわち、処理が完了したリクエストによって生成されたオブジェクトを抽出する。したがって、リクエストＩＤが“２”以外のリクエスト、すなわち、リクエストＩＤが“１”のリクエストによって生成されたオブジェクト“Ａ”及び“Ｂ”が、図２Ｂのオブジェクト管理テーブル１１２から抽出され、リークオブジェクト一覧１１８が生成される。
【０１３０】
生成されたリークオブジェクト一覧１１８は、ＵＩ１１３（図１０の画面３０１のオブジェクト一覧３１２）に表示される（Ｓ８０５）。
【０１３１】
続いて、ユーザは、画面３０１の詳細表示ボタン３１３を操作することによって、ＵＩ１１３に表示したメモリリークの疑いのあるオブジェクト一覧から、さらに詳細を調査するオブジェクトを選択する（Ｓ８０６）。
【０１３２】
メモリリーク解析部１１４は、選択された調査対象のオブジェクトを生成したすべてのリクエストを、Ｓ８０４の処理によって生成されたリークオブジェクト一覧１１８から検索する（Ｓ８０７）。そして、検索されたリクエストは、ＵＩ１１３（図１０の画面３０２のリクエスト一覧３１４）に表示される（Ｓ８０８）。
【０１３３】
画面３０２を参照すると、オブジェクト“Ａ”が選択されている。オブジェクト“Ａ”は、図９Ｂのリークオブジェクト一覧１１８を参照すると、リクエストＩＤが“１”のリクエストによって生成されたことがわかる。
【０１３４】
さらに、ユーザは、画面３０２に表示されたリクエスト一覧３１４から、詳細なトレース情報を表示するリクエストを選択し、トレース表示ボタン３１５を操作する（Ｓ８０９）。そして、メモリリーク解析部１１４は、選択されたリクエストのトレース情報をリクエストトレーステーブル１０８から検索する（Ｓ８１０）。最後に、検索されたリクエストのトレース情報を、ＵＩ１１３（図１０の画面３０３）に時系列順に表示する（Ｓ８１１）。図１０の画面３０３には、リクエストＩＤが“１”のリクエストのトレース情報が表示されている。
【０１３５】
リクエストトレーステーブル１０８は、すべてのリクエストのトレース情報が記録される。そのため、リクエストトレーステーブル１０８に含まれるトレース情報の数は、時間が経過するにしたがって増加し続けることとなる。したがって、リクエストトレーステーブル１０８から、不要なリクエストのトレース情報を削除する必要がある。
【０１３６】
図１２は、本発明の実施の形態のリクエストトレーステーブル１０８に格納されたトレース情報を削除する手順を示すフローチャートである。なお、トレース情報の削除処理は、一定時間ごとに実行してもよいし、リクエストトレーステーブル１０８に格納されたトレース情報のレコード数が、閾値を超えた場合に実行してもよい。
【０１３７】
削除されるトレース情報は、完了済のリクエストであって、かつ、当該リクエストによって生成されたオブジェクトがメモリリークを発生させていないリクエストに関するトレース情報であって、オブジェクトの生成又は解放について記録されたレコードとする。
【０１３８】
リクエストトレース部１０７は、まず、リクエストトレーステーブル１０８から、リクエスト完了のトレース情報が記録されているすべてのリクエストを検索する（Ｓ９０１）。
【０１３９】
さらに、リクエストトレース部１０７は、Ｓ９０１の処理で取得されたリクエストを当該リクエストによって生成され、かつ、すべてのオブジェクトが解放済であるリクエストに絞り込む（Ｓ９０２）。なお、リクエストによって生成されたオブジェクトが解放済であるか否かは、オブジェクト管理テーブル１１２に当該リクエストによって生成されたオブジェクトが登録されていないことを確認することによって判定する。
【０１４０】
最後に、リクエストトレース部１０７は、Ｓ９０２の処理で絞り込まれたリクエストのリクエストＩＤを有し、オブジェクトの生成又は開放が記録されたトレース情報を、リクエストトレーステーブル１０８から削除する（Ｓ９０３）。
【０１４１】
以上の処理によって、メモリリークが発生していないリクエストについて、プログラムの実行などの通常のトレース情報以外の、オブジェクトの生成又は解放が記録されたレコードがリクエストトレーステーブル１０８から削除される。オブジェクトの生成又は解放が記録されたレコードは、メモリリークの検出及び発生要因をするために記録されるため、メモリリークを発生させずに正常に処理が完了したリクエストでは不要となる。そこで、所定のタイミングで、オブジェクトの生成又は解放が記録されたレコードを削除することによって、トレース情報を記憶するための容量を削減することができる。
【０１４２】
本発明の実施の形態によれば、ユーザから受け付けたリクエストを処理するとき、リクエストの受け付けから終了までに発生したイベントの履歴（トレース情報）をリクエストトレーステーブル１０８に記録する。また、受け付けたリクエストを処理するために生成されたオブジェクトをリクエストと対応付けてオブジェクト管理テーブル１１２に記録する。そして、リクエストトレーステーブル１０８及びオブジェクト管理テーブル１１２に格納された情報に基づいて、メモリリークの疑いのあるオブジェクトを抽出することが可能となる。
【０１４３】
さらに、本発明の実施の形態によれば、リクエストトレーステーブル１０８にトレース情報が記録されているため、メモリリークが発生したオブジェクトを生成するタイミング及び前後の処理を特定することができる。したがって、メモリリークが発生する条件を容易に特定することができる。
【図面の簡単な説明】
【０１４４】
【図１】本発明の実施の形態の装置構成を示す説明図である。
【図２Ａ】本発明の実施の形態のリクエストトレーステーブルの一例を示す説明図である。
【図２Ｂ】本発明の実施の形態のオブジェクト管理テーブルの一例を示す説明図である。
【図３Ａ】本発明の実施の形態のリクエスト処理時のオブジェクト管理の処理の流れを示す説明図である。
【図３Ｂ】本発明の実施の形態のリクエスト処理時のオブジェクト生成時の処理の流れを示す説明図である。
【図３Ｃ】本発明の実施の形態のオブジェクト解放時の処理の流れを示す説明図である。
【図４】本発明の実施の形態のリクエスト処理時のオブジェクト管理処理のフローチャートである。
【図５】本発明の実施の形態のユーザプログラムの処理手順を示すフローチャートである。
【図６】本発明の実施の形態のオブジェクト生成処理の手順を示すフローチャートである。
【図７】本発明の実施の形態のオブジェクト解放処理の手順を示すフローチャートである。
【図８】本発明の実施の形態のメモリリークの検出処理の流れを示す説明図である。
【図９Ａ】本発明の実施の形態の実行中リクエスト一覧の一例を示す図である。
【図９Ｂ】本発明の実施の形態のリークオブジェクト一覧の一例を示す説明図である。
【図１０】本発明の実施の形態のメモリリーク検出処理の画面の一例を示す説明図である。
【図１１】本発明の実施の形態のメモリリーク検出処理の手順を示すフローチャートである。
【図１２】本発明の実施の形態のリクエストトレーステーブルに格納されたトレース情報を削除する手順を示すフローチャートである。
【符号の説明】
【０１４５】
１０  端末
２０  ネットワーク
３０  アプリケーション（ＡＰ）サーバ
４０  メモリ領域
１０１  リクエスト受付部
１０２  プログラム群
１０３  ユーザメモリ領域
１０４  コンテナプログラム
１０５  ユーザプログラム
１０６  オブジェクト
１０７  リクエストトレース部
１０８  リクエストトレーステーブル
１０９  オブジェクト管理部
１１０  オブジェクトＩＤ管理部
１１１  ＧＣ処理部
１１２  オブジェクト管理テーブル
１１３  ＵＩ（ＧＵＩ、ＣＵＩ）
１１４  メモリリーク解析部
１１５  実行中リクエスト解析部
１１６  リークオブジェクト解析部
３００  メモリリーク検出プログラム初期画面
３０１  メモリリークの疑いのあるオブジェクト一覧表示画面
３０２  オブジェクトを生成したリクエスト一覧表示画面
３０３  リクエストのトレース情報画面
【図１】
2008134709.tif 000003
【図２Ａ】
2008134709.tif 000004
【図２Ｂ】
2008134709.tif 000005
【図３Ａ】
2008134709.tif 000006
【図３Ｂ】
2008134709.tif 000007
【図３Ｃ】
2008134709.tif 000008
【図４】
2008134709.tif 000009
【図５】
2008134709.tif 000010
【図６】
2008134709.tif 000011
【図７】
2008134709.tif 000012
【図８】
2008134709.tif 000013
【図９Ａ】
2008134709.tif 000014
【図９Ｂ】
2008134709.tif 000015
【図１０】
2008134709.tif 000016
【図１１】
2008134709.tif 000017
【図１２】
2008134709.tif 000018