(57)【要約】【課題】データ領域解放を明示しない言語を用いたプログラムの実行で発生するメモリリークに対して、メモリリーク発生源の調査にかかる労力を減らす。【解決手段】期間をあけて、メモリに格納された複数のデータに関して、データ相互間の参照関係を２回把握する。次に、二回目のデータのうちから、一回目のデータに存在しなかった増加データＣ１，Ｅ２，Ｅ３を抽出し、この増加データに対してデータサイズに応じた重み「１」「２」「２」をつける。続いて、参照先の下位データから、順次、参照元である上位データに重みを順次伝播させる。この際、上位データＤ０に対して、下位データデータＥ２，Ｅ３が複数ある場合には、複数の下位データＥ２，Ｅ３の重み「２」「２」を加算してものを上位データＤ０の重み「４」とする。各データの重みは、メモリリーク発生原因になっている危険度を表す。【選択図】  図１１
2005301660.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータのメモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる、プログラミング言語で記述されたプログラムの実行で発生したメモリリークの原因箇所検出方法において、
前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第１関係把握工程と、
前記第一回関係把握工程の後、前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第２関係把握工程と、
前記第２関係把握工程で参照関係が把握された複数のデータのうちから、前記第１関係把握工程で参照関係が把握された複数のデータ中に存在していなかった１以上の増加データを抽出する増加データ抽出工程と、
前記増加データ抽出工程で抽出された１以上の前記増加データ毎に、各増加データのデータサイズに応じた重みを付け、参照先の下位データから、順次、参照元の上位データに該重みを順次伝播させ、該重みの伝播過程で、複数の下位データに対して一の上位データが参照関係を成しているときには、該複数の下位データの重みを加算して、該一の上位データの重みとし、各データの重みをメモリリーク発生原因になっている可能性を示す危険度とする重み付け工程と、
を含むことを特徴とするメモリリークの原因箇所検出方法。
【請求項２】
請求項１に記載のメモリリークの原因箇所検出方法において、
前記重み付け工程では、１以上の前記増加データをデータ種類毎に分類し、分類されたデータ群に対して、各データ群のデータサイズに応じた重みを付ける、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項３】
請求項１及び２のいずれか一項に記載のメモリリークの原因箇所検出方法において、
前記参照関係を成す複数のデータの各重みのうちで、最も大きな重みのデータが複数存在し、且つ最も大きな重みの複数のデータが上位データと下位データとの関係を成す際には、該下位データの方をメモリリーク発生原因の可能性が高いものとして抽出する最危険データ抽出工程を含む、
ことを特徴とするメモリリーク原因箇所検出方法。
【請求項４】
請求項１から３のいずれか一項に記載のメモリリークの原因箇所検出方法において、
前記メモリの使用量を複数回調査し、複数回の調査結果からメモリリークが発生しているか否かを判断するメモリリーク検出工程を含み、
前記第２関係把握工程は、前記メモリリーク検出工程でメモリリークが発生していると判断されたときと並行して、又はそのとき以降に実行する、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項５】
請求項４に記載のメモリリークの原因箇所検出方法において、
前記メモリリーク検出工程では、複数回の調査のうちで、一の調査時のメモリ使用量に対して、該一の調査以降の調査時のメモリ使用量が予め定められた増加量以上に増加しているときには、メモリリークが発生していると判断する、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項６】
請求項１から５のいずれか一項に記載のメモリリーク原因箇所検出方法において、
前記プログラムから、メモリリーク発生原因になっている可能性の高いデータが記述されている箇所を抽出するプログラム原因箇所抽出工程を含む、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項７】
請求項６に記載のメモリリークの原因箇所検出方法において、
前記プログラミング言語で記述された前記プログラムは、中間言語に変換されて実行されるプログラムであり、
前記プログラム原因箇所抽出工程では、前記中間言語に変換された前記プログラムから、前記メモリリーク発生原因になっている可能性の高いデータが記述されている箇所を見出し、前記プログラム言語で記述された前記プログラムから該箇所と対応する個所を抽出する、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項８】
請求項１から７のいずれか一項に記載のメモリリークの原因箇所検出方法において、
前記重み付け工程の結果を少なくとも表示する表示工程を含む、
ことを特徴とするメモリリークの原因箇所検出方法。
【請求項９】
コンピュータのメモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる、プログラミング言語で記述されたプログラムの実行で発生したメモリリークの原因箇所検出プログラムにおいて、
前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第１関係把握工程と、
前記第一回関係把握工程の後、前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第２関係把握工程と、
前記第２関係把握工程で参照関係が把握された複数のデータのうちから、前記第１関係把握工程で参照関係が把握された複数のデータ中に存在していなかった１以上の増加データを抽出する増加データ抽出工程と、
前記増加データ抽出工程で抽出された１以上の前記増加データ毎に、各増加データのデータサイズに応じた重みを付け、参照先の下位データから、順次、参照元の上位データに該重みを伝播させ、該重みの伝播過程で、複数の下位データに対して一の上位データが参照関係を成しているときには、該複数の下位データの重みを加算して、該一の上位データの重みとし、各データの重みをメモリリーク発生原因になっている可能性を示す危険度とする重み付け工程と、
をコンピュータに実行させることを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１０】
請求項９に記載のメモリリークの原因箇所検出プログラムにおいて、
前記重み付け工程では、１以上の前記増加データをデータ種類毎に分類し、分類されたデータ群に対して、各データ群のデータサイズに応じた重みを付ける、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１１】
請求項９及び１０のいずれか一項に記載のメモリリークの原因箇所検出プログラムにおいて、
前記参照関係を成す複数のデータの各重みのうちで、最も大きな重みのデータが複数存在し、且つ最も大きな重みの複数のデータが上位データと下位データとの関係を成す際には、該下位データの方をメモリリーク発生原因の可能性が高いものとして抽出する最危険データ抽出工程、
をコンピュータに実行させることを特徴とするメモリリーク原因箇所検出方法。
【請求項１２】
請求項９から１１のいずれか一項に記載のメモリリークの原因箇所検出プログラムにおいて、
前記メモリの使用量を複数回調査し、複数回の調査結果からメモリリークが発生しているか否かを判断するメモリリーク検出工程をコンピュータに実行させ、
前記第２関係把握工程は、前記メモリリーク検出工程でメモリリークが発生していると判断されたときと並行して、又はそのとき以降に実行する、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１３】
請求項１２に記載のメモリリークの原因箇所検出プログラムにおいて、
前記メモリリーク検出工程では、複数回の調査のうちで、一の調査時のメモリ使用量に対して、該一の調査以降の調査時のメモリ使用量が予め定められた増加量以上に増加しているときには、メモリリークが発生していると判断する、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１４】
請求項９から１４のいずれか一項に記載のメモリリーク原因箇所検出プログラムにおいて、
前記プログラムから、前記危険度の高いデータが記述されている箇所を抽出するプログラム原因箇所抽出工程、
をコンピュータに実行させることを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１５】
請求項１４に記載のメモリリークの原因箇所検出プログラムにおいて、
前記プログラミング言語で記述された前記プログラムは、中間言語に変換されて実行されるプログラムであり、
前記プログラム原因箇所抽出工程では、前記中間言語に変換された前記プログラムから、前記危険度の高いデータが記述されている箇所を見出し、前記プログラム言語で記述された前記プログラムから該箇所と対応する個所を抽出する、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１６】
請求項９から１５のいずれか一項に記載のメモリリークの原因箇所検出プログラムにおいて、
前記重み付け工程の結果を少なくとも表示する表示工程
をコンピュータに実行させることを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１７】
請求項１６に記載のメモリリークの原因箇所検出プログラムにおいて、
前記表示工程では、前記第２関係把握工程で把握された複数のデータを、参照関係が分かるように表示すると共に、複数の各データ毎の危険度を表示する、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１８】
請求項１４及び１５のいずれか一項に記載のメモリリークの原因箇所検出プログラムにおいて、
前記危険度の高いデータのデータ名、該データのデータ種宣言、前記プログラム言語で記載された前記プログラム中の該データの記載箇所を表示する表示工程、
をコンピュータに実行させることを特徴とするメモリリークの原因箇所検出プログラム。
【請求項１９】
請求項１８に記載のメモリリークの原因箇所検出プログラムにおいて、
前記プログラム言語は、Java言語であり、
前記表示工程では、前記危険度の高いデータのデータ名と関係付けて、該データの所属するデータ種を表示する、
ことを特徴とするメモリリークの原因箇所検出プログラム。
【請求項２０】
請求項９から１９のいずれか一項に記載のメモリリーク原因箇所検出プログラムにおいて、
前記プログラムは、Ｗｅｂサービス提供プログラムである、
ことを特徴とするメモリリーク原因箇所検出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータのメモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる、Java言語等のプログラミング言語で記述されたプログラムの実行で発生したメモリリークの原因箇所検出方法、及びその実行プログラムに関する。
【背景技術】
【０００２】
コンピュータプログラムが期待通りの性能を示さない原因の一つとして、プログラムが使用するデータ記憶領域が増え続けるメモリリークという現象が挙げられる。通常、プログラムを実行する際に生成されるデータは、ヒープ領域と呼ばれる記憶領域に配置される。ヒープ領域とは、プログラム実行中に使用されるメモリ領域の一種であり、プログラムに入力されたデータなど、格納領域の大きさが動的に決定されるデータの格納に利用される。データを格納する際には、格納するデータの大きさに基づいた格納用領域確保が必要であり、そのデータが不要になった際には、確保した格納用領域を解放する操作が必要である。確保した領域の解放操作が適切に行われなかった場合や、実行系から未解放データが見えなくなってしまった場合、プログラムが使用しているメモリ領域が増加し続ける状態、すなわちメモリリークが発生する。
【０００３】
このメモリリークの発生パターンは、大きく2種類に分けることができる。1つは、C言語やC++言語のように、領域解放の操作を明示的に行う言語におけるメモリリークであり、もう1つは、Java言語（Javaは米国Sun Microsystems, Inc.及びその他の国における商標または登録商標）のように領域解放を暗黙的に行う言語におけるメモリリークである。
【０００４】
C言語やC++言語のように、ヒープ領域における領域解放を明示的に指示する言語の場合、領域解放不足によるメモリリークがある。また、ヒープ領域内のデータ格納領域への参照を保持しているフィールドに対して、領域解放前に誤って別の参照を代入した際に、ヒープ領域内に確保されていたデータ格納領域への参照が消滅してしまうことによるメモリリークもある。これを解決する方法として、以下の非特許文献１に記載されているように、プログラム実行中のデータ領域確保および解放を監視し、解放されていない領域をメモリリークの原因データと見なし、その発生箇所を特定するための技術や、また、以下の非特許文献２に記載されているように、コンパイル時の静的なポインタ解析によってメモリリークを防止する技術がある。
【０００５】
一方、Java言語のようにデータ領域解放を暗黙的に行うプログラミング言語では、不要になったデータ格納用領域を回収するガベージコレクション機能が利用可能であることが多い。Java言語によるプログラムは、一旦、中間言語によるプログラムに変換され、この中間言語によるプログラムが、仮想マシン上で実行される。このJava言語によるプログラムでは、このプログラム中でメモリ領域の解放を指定することはなく、仮想マシンに備わっているガベージコレクション機能により、不必要なデータが回収される。前述したデータ領域の暗黙的解放とは、このように、Java言語によるプログラム自体に、メモリ領域の解放が指定されておらず、ガベージコレクション機能等によりデータの領域が解放されることである。このガベージコレクション機能は、データの参照関係から外れたデータを回収する機能であるため、不必要になったデータに対して、プログラムミスによってプログラム作成者が予期しない参照が生じている場合には、ガベージコレクション機能による回収対象にならず、不要なデータがメモリ中で増え続けるメモリリークが発生してしまう。すなわち、ガベージコレクション機能では、たとえ、ユーザにとって不必要なデータであっても、データ参照関係があるデータに関しては、データ回収の対象にならない。
【０００６】
以上のように、Java言語のようなプログラミング言語では、データ領域の解放操作が非明示的であるため、プログラム中でリーク発生原因箇所を特定することは極めて困難である関係上、C言語やC++言語で用いたメモリリーク発生箇所検出手法を用いることできない。そのため、Java言語によるプログラムに関してメモリリークが疑われる際には、例えば、特許文献１，２に記載されているように、メモリ中で使用量が増加しているデータ群を示す技術や、非特許文献３に記載されているように、データ群から選択したあるデータに関する参照関係を図示することによって、メモリリーク発生箇所の発見を補助するための方法が開発されている。
【０００７】
【非特許文献１】RATIONAL Software, “Purify: Fast Detection of Memory Leaks and Access Errors”, Purify Product Information White Papers.
【非特許文献２】David L. Heine and Monica S. Lam, “A Practical Flow-Sensitive and Context Sensitive C and C++ Memory Leak Detector”, Proc. of the ACM SIGPLAN 2003 conference on Programming language design and implementation, 2003
【特許文献１】United States Patent 6,167,535
【特許文献２】United States Patent 6,370,684
【非特許文献３】Wim De Pauw and Gary Sevitsky, “Visualizing Reference Patterns for Solving Memory Leaks in Java”, Proc. of the 13th European Conference on Object-Oriented Programming, 1999
【発明の開示】
【発明が解決しようとする課題】
【０００８】
Java言語のように、データ領域解放を暗黙的に行う言語を用いたプログラムの実行で発生するメモリリークに対して、従来技術では、前述の特許文献１，２のように、メモリ中で使用量が増加しているデータ群を示すか、前述の非特許文献２のように、データ群から選択したあるデータに関する参照関係を図示するにとどまっている上に、多くの場合、メモリリークが疑われるデータは1つではないことが多く、しかも、データの参照関係も膨大な数であるため、メモリリーク発生源の調査が非常に困難な作業となっているという問題点がある。
【０００９】
本発明は、以上の従来技術の問題点に着目し、データ領域解放を明示しない言語を用いたプログラムの実行で発生するメモリリークに対して、メモリリーク発生源の調査にかかる労力を減らすことができるメモリリークの原因箇所検出方法、及びその実行プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
前記目的を達成するためのメモリリークの原因箇所検出方法に係る第一の発明は、
コンピュータのメモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる、プログラミング言語で記述されたプログラムの実行で発生したメモリリークの原因箇所検出方法において、
前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第１関係把握工程と、
前記第一回関係把握工程の後、前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第２関係把握工程と、
前記第２関係把握工程で参照関係が把握された複数のデータのうちから、前記第１関係把握工程で参照関係が把握された複数のデータ中に存在していなかった１以上の増加データを抽出する増加データ抽出工程と、
前記増加データ抽出工程で抽出された１以上の前記増加データ毎に、各増加データのデータサイズに応じた重みを付け、参照先の下位データから、順次、参照元の上位データに該重みを順次伝播させ、該重みの伝播過程で、複数の下位データに対して一の上位データが参照関係を成しているときには、該複数の下位データの重みを加算して、該一の上位データの重みとし、各データの重みをメモリリーク発生原因になっている可能性を示す危険度とする重み付け工程と、
を含むことを特徴とする。
【００１１】
メモリリークの原因箇所検出方法に係る第二の発明は、
メモリリークの原因箇所検出方法に係る第一の発明において、
前記重み付け工程では、１以上の前記増加データをデータ種類毎に分類し、分類されたデータ群に対して、各データ群のデータサイズに応じた重みを付ける、ことを特徴とする。
【００１２】
メモリリークの原因箇所検出方法に係る第三の発明は、
メモリリークの原因箇所検出方法に係る第一又は第二の発明において、
前記参照関係を成す複数のデータの各重みのうちで、最も大きな重みのデータが複数存在し、且つ最も大きな重みの複数のデータが上位データと下位データとの関係を成す際には、該下位データの方をメモリリーク発生原因の可能性が高いものとして抽出する最危険データ抽出工程を含む、ことを特徴とする。
【００１３】
メモリリーク原因箇所検出方法に係る第四の発明は、
メモリリークの原因箇所検出方法に係る第一から第三の発明のいずれかにおいて、
前記メモリの使用量を複数回調査し、複数回の調査結果からメモリリークが発生しているか否かを判断するメモリリーク検出工程を含み、
前記第２関係把握工程は、前記メモリリーク検出工程でメモリリークが発生していると判断されたときと並行して、又はそのとき以降に実行する、ことを特徴とする。
【００１４】
メモリリークの原因箇所検出方法に係る第五の発明は、
メモリリーク原因箇所検出方法に係る第一からの第四の発明のいずれかにおいて、
前記プログラムから、メモリリーク発生原因になっている可能性の高いデータが記述されている箇所を抽出するプログラム原因箇所抽出工程を含む、ことを特徴とする。
【００１５】
前記目的を達成するためのメモリリーク原因箇所検出プログラムに係る第一の発明は、
コンピュータのメモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる、プログラミング言語で記述されたプログラムの実行で発生したメモリリークの原因箇所検出プログラムにおいて、
前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第１関係把握工程と、
前記第一回関係把握工程の後、前記メモリに格納された複数のデータに関して、データ相互間の参照関係を把握する第２関係把握工程と、
前記第２関係把握工程で参照関係が把握された複数のデータのうちから、前記第１関係把握工程で参照関係が把握された複数のデータ中に存在していなかった１以上の増加データを抽出する増加データ抽出工程と、
前記増加データ抽出工程で抽出された１以上の前記増加データ毎に、各増加データのデータサイズに応じた重みを付け、参照先の下位データから、順次、参照元の上位データに該重みを伝播させ、該重みの伝播過程で、複数の下位データに対して一の上位データが参照関係を成しているときには、該複数の下位データの重みを加算して、該一の上位データの重みとし、各データの重みをメモリリーク発生原因になっている可能性を示す危険度とする重み付け工程と、
をコンピュータに実行させることを特徴とする。
【００１６】
メモリリークの原因箇所検出プログラムに係る第二の発明は、
メモリリークの原因箇所検出プログラムに係る第一の発明において、
前記参照関係を成す複数のデータの各重みのうちで、最も大きな重みのデータが複数存在し、且つ最も大きな重みの複数のデータが上位データと下位データとの関係を成す際には、該下位データの方をメモリリーク発生原因の可能性が高いものとして抽出する最危険データ抽出工程をコンピュータに実行させることを特徴とする。
【００１７】
メモリリーク原因箇所検出方法に係る第三の発明は、
メモリリークの原因箇所検出プログラムに係る第一又は第二の発明において、
前記メモリの使用量を複数回調査し、複数回の調査結果からメモリリークが発生しているか否かを判断するメモリリーク検出工程をコンピュータに実行させ、
前記第２関係把握工程は、前記メモリリーク検出工程でメモリリークが発生していると判断されたときと並行して、又はそのとき以降に実行する、ことを特徴とする。
【００１８】
メモリリークの原因箇所検出プログラムに係る第四の発明は、
メモリリーク原因箇所検出プログラムに係る第一から第三の発明のいずれかにおいて、
前記プログラムから、前記危険度の高いデータが記述されている箇所を抽出するプログラム原因箇所抽出工程をコンピュータに実行させることを特徴とする。
【００１９】
メモリリークの原因箇所検出プログラムに係る第五の発明は、
メモリリークの原因箇所検出プログラムに係る第一から第四の発明のいずれかにおいて、
前記重み付け工程の結果を少なくとも表示する表示工程をコンピュータに実行させることを特徴とする。
【００２０】
メモリリークの原因箇所検出プログラムに係る第六の発明は、
メモリリークの原因箇所検出プログラムに係る第五の発明において、
前記表示工程では、前記第２関係把握工程で把握された複数のデータを、参照関係が分かるように表示すると共に、複数の各データ毎の危険度を表示する、ことを特徴とする。
【００２１】
メモリリークの原因箇所検出プログラムに係る第七の発明は、
メモリリークの原因箇所検出プログラムに係る第四の発明において、
前記危険度の高いデータのデータ名、該データのデータ種宣言、前記プログラム言語で記載された前記プログラム中の該データの記載箇所を表示する表示工程をコンピュータに実行させることを特徴とする。
【発明の効果】
【００２２】
本発明によれば、参照関係を成している複数のデータに重みを付け、この重みをメモリリーク発生原因になっている可能性を示す危険度としているので、メモリリーク発生源となっているデータを特定し易くなり、メモリリーク発生源の調査にかかる労力を減らすことができる。
【発明を実施するための最良の形態】
【００２３】
以下、本発明に係るメモリリーク原因箇所検出方法の一実施形態について、図面を用いて説明する。
【００２４】
図１は、本実施形態のメモリリーク原因箇所検出方法を実行するコンピュータ１００の構成を示す図である。
【００２５】
このコンピュータ１００は、ネットワーク１に接続されたサーバである。このサーバ１００は、各種処理を実行するプロセッサ１１０と、プロセッサ１１０が実行する各種プログラム１３１，１３５が記憶されるプログラムメモリ１３０と、各種データが格納されるデータメモリ１４０と、外部記憶装置１２０と、表示装置１５０と、ネットワーク１を介して他の装置と通信するためのインタフェース１６０と、を備えている。
【００２６】
外部記憶装置１２０には、このサーバ１００が提供するＷｅｂサービスを実行するプログラム１２１が格納されている。このプログラム１２１は、Java言語で記述されている。
【００２７】
プログラムメモリ１３０には、外部記憶装置１２０に格納されているJava言語のプログラム１２１が中間言語に変換されたプログラム１３１と、このプログラム１３１の実行により生じるメモリリークの原因箇所を検出するプログラム１３５とが格納されている。
【００２８】
プロセッサ１１０は、機能的には、外部記憶装置１２０に格納されているプログラム１２１をJava言語から中間言語に変換する変換部１１２と、中間言語で記述されたプログラム１３１を実行する仮想マシン１１１と、リーク原因箇所検出プログラム１３５の実行で機能するリーク原因箇所検出部１１５と、を有している。なお、変換部１１２及び仮想マシン１１１も、プログラムメモリ１３０中に格納されているプログラム（図示されていない。）を実行することで機能する。この仮想マシン１１１には、従来技術の欄で述べたガベージコレクション機能が設けられている。このガベージコレクション機能により、データメモリ１４０から不要なデータが回収される。リーク原因箇所検出部１１５は、データメモリ１４０のメモリ使用量を監視してメモリリークを検出するメモリリーク検出部１１６と、データメモリ１４０内のヒープ領域に格納されている複数のデータのリーク危険度を求めるリーク危険度算出部１１７と、検査対象プログラム１２１，１３１中から危険度の高いデータが記述されている箇所を抽出するプログラム原因箇所抽出部１１８と、以上の各部での結果等を表示装置１５０に表示させる表示部１１９と、を有している。
【００２９】
なお、この実施形態では、プログラムが格納されるプログラムメモリ１３０とデータが格納されるデータメモリ１４０とがあるが、本発明では、メモリ中にプログラム領域及びデータ領域があればよく、これらの領域毎にメモリが存在する必要性はない。また、ここでは、１つのコンピュータ１００内で、検査対象プログラム１２１，１３１とリーク原因箇所検出プログラム１３５とを実行するようにしているが、それぞれのプログラムを異なるコンピュータで実行するようにしてもよい。
【００３０】
次に、図２に示すフローチャートに従って、メモリリーク検出部１１６の動作について説明する。
【００３１】
メモリリーク検出部１１６は、データメモリ１４０の使用量の調査をｎ回実行し（Ｓ１１，Ｓ１２）、このｎ回の調査結果からデータメモリ１４０にメモリリークが発生しているか否かを判断する（Ｓ１３）。メモリリークが発生していないと判断した場合には、処理を終了し、メモリリークが発生していると判断した場合には、リーク危険度算出部１１７にその旨を通信して（Ｓ１４）、処理を終了する。
【００３２】
このｎ回の調査結果からデータメモリ１４０にメモリリークが発生しているか否かを判断方法は、各種方法が考えられる。例えば、図３に示すように、ｎ回の調査のうちの最初のｍ回の調査における使用量平均値ＡＶＥ０と、後のｍ回の調査における使用量平均値ＡＶＥ１との差Ｓａが予め定められた値より大きい場合には、メモリリークが発生していると判断してもよい。なお、同図中の縦軸はメモリ使用量を示し、横軸は調査時刻を示している。
【００３３】
また、ｎ回の調査のうちで最初の極大値Ｔ０と、最後の極小値Ｂｎとの差Ｓｂが予め定められた値より大きい場合には、メモリリークが発生していると判断してもよい。
【００３４】
次に、図４に示すフローチャートに従って、リーク危険度算出部１１７の動作について説明する。
【００３５】
リーク危険度算出部１１７は、まず、データメモリ１４０のヒープ領域内に格納されている全てのデータに関して、データ相互関係の参照関係を把握する（Ｓ２１）。続いて、その後、再び、データメモリ１４０のヒープ領域内に格納されている全てのデータに関して、データ相互関係の参照関係を把握する（Ｓ２２）。検査対象プログラム１３５の実行で、データメモリ１４０のヒープ領域に格納される各データ１４１は、図５に示すように、そのデータ本体であるペイロードフィールド１４２と、次のデータの先頭アドレスを示す参照関係フィールド１４３を有しており、リーク危険度算出部１１７は、この参照関係フィードに格納されている次のデータの先頭アドレスから、データ相互間の参照関係を把握する。
【００３６】
ここで、第一回目の参照関係把握工程（Ｓ２１）では、例えば、図６（ａ）に示すように、データＡ０がデータＢ０，Ｂ１を参照し、データＢ１がデータＣ０を参照し、データＢ０がデータＤ０を参照し、このデータＤ０がデータＥ０，Ｅ１を参照していると把握したとする。なお、同図において、円はデータを示し、円の右下の通知はデータサイズを示している。また、同一アルファベットで示されるデータは、同種のデータ、つまり、Java言語では、所属するクラスが同じデータであることを示している。例えば、データＥ０，Ｅ１は、同じＥ種のデータであることを示している。また、第二回目の参照関係把握工程（Ｓ２２）では、同図（ｂ）に示すように、第一回目の参照関係把握工程（Ｓ２１）で把握されたデータＢ１が新たにデータＣ１を参照し、データＤ０が新たにデータＥ２，Ｅ３を参照していると把握したとする。
【００３７】
ところで、第一回目の参照関係把握工程（Ｓ２１）は、例えば、図２に示すメモリ使用量の調査工程（Ｓ１１）の初回の実施タイミングに併せて実行する。また、第二回目の参照関係把握工程（Ｓ２２）は、図２に示すリーク危険度算出部への通知工程（Ｓ１４）の実行により、メモリリークが発生している旨の通知を受けてから実行する。なお、ここでは、メモリリークが発生している旨の通知を受けてから、第二回目の参照関係把握工程（Ｓ２２）を実行しているが、図２に示すｎ回のメモリ使用量の調査工程（Ｓ１１，Ｓ１２）毎に、参照関係把握工程を実行し、初回の参照関係把握工程を第一回目の参照関係把握工程とし、メモリリークが発生している旨の通知を受けたときの参照関係把握工程を第二回目の参照工程把握工程としてもよい。また、ここでは、メモリリーク検出部１１６でメモリリークの検出を行っているが、このリーク検出を実行せずに、第一回目の参照関係把握工程（Ｓ２１）の後、予め定められた期間後に第二回目の参照関係把握工程（Ｓ２２）を実行してもよい。この予め定められた期間としては、本実施形態のように、検査対象プログラムがＷｅｂサービス提供プログラムで、極めて長期間継続的に実行させるものでは、例えば、三日、さらには一週間等の期間が考えられる。
【００３８】
リーク危険度算出部１１７は、第二回目の参照関係把握工程（Ｓ２２）が終了すると、第二回目の参照関係把握工程（Ｓ２２）で把握した参照関係を成す複数のデータのうちで、第一回目の参照関係把握工程（Ｓ２１）で把握した参照関係を成す複数のデータから新たに増加したデータを抽出し、この増加したデータに重みを付ける（Ｓ２３）。
【００３９】
ここで、この新たに増加したデータの抽出、及び重み付け（Ｓ２３）の手順について、図７に示すフローチャートに従って説明する。
【００４０】
リーク危険度算出部１１７は、まず、前述の第一回目の参照関係把握工程（Ｓ２１）で参照関係を把握した複数のデータを走査し（Ｓ３１）、続いて、前述の第二回目の参照関係把握工程（Ｓ２２）で参照関係を把握した複数のデータを走査する（Ｓ３２）。この第二回目の参照関係把握工程で参照関係を把握したデータの走査の際には、先ず、第二回目の参照関係把握工程で参照関係を把握した複数のデータのうちから、１つのデータを選択し（Ｓ４１）、このデータが第一回目の参照関係把握工程で参照関係を把握した複数のデータのうちで同じものがあるか否か、つまり新しいデータであるか否かを判断する（Ｓ４２）。このデータが新しいデータでなければ、再び、ステップ４１に戻り、新しいデータであれば、このデータの種類を取得する（Ｓ４３）。ここで、データの種類とは、データ相互間に一定の関係を有するデータのまとまりで、前述したように、Java言語では、所属するクラスに相当する。そして、データ種別毎にデータサイズを合計し（Ｓ４４）、未走査のデータがあるか否かを判断し（Ｓ４５）、未走査のデータがあればＳ４１に戻り、未走査のデータがなければ終了する。
【００４１】
第二回目の参照関係把握工程で参照関係を把握したデータの走査（Ｓ３２）が終了すると、図８に示すように、新たに増加したデータとして、データＣ１及びデータＥ２，Ｅ３が抽出され、これらのデータがデータＣ種のまとまりとデータＥ種のまとまりに分類され、各データ種の合計データサイズが取得される。具体的には、データＣ種としてデータＣ１がまとめられ、データＥ種としてデータＥ２，Ｅ３がまとめられる。そして、データＣ種の合計データサイズとして「２」が取得され、データＥ種の合計データサイズとして「１０（＝５＋５）」が取得される。なお、同図において、各データの左下に付されている数値がデータサイズを示している。
【００４２】
リーク危険度算出部１１７は、続いて、増加データ種のデータサイズの小さい順に、各データ種に順位をつける（Ｓ３３）。ここでは、図８に示すように、増加データ種Ｃ，Ｅのうちで、合計データサイズの小さい方のデータ種Ｃが１位となり、データ種Ｅが２位となる。
【００４３】
次に、リーク危険度算出部１１７は、増加データ種Ｃ，Ｅ毎に、それらの順位に応じた重みを付けて（Ｓ３４）、増加データの抽出及び各増加データへの重み付け工程（Ｓ２３）が終了する。各増加データ種へ付ける重みは、具体的には、図９中の重み例１のように、Ｓ３３で付けた順位をそのまま重みとして付ける。なお、このように、順位をそのまま重みとしてもよいが、同図中の重み例２のように、データサイズ比を重みとしてもよい。すなわち、データサイズに応じて、データサイズが大きいものには大きな重みを付け、データサイズが小さいものには小さな重みを付ければよい。また、ここでは、データ種別に分類して、各データ種毎に重みを付けているが、データ種別に分類せずに、各データ毎に重みを付けてもよい。
【００４４】
Ｓ２３の工程が終了すると、図４のフローチャートに示すように、第二回目の参照関係把握工程（Ｓ２２）で把握した全てのデータに重みを付ける（Ｓ２４）。すなわち、最下位の増加データの重みを、参照元である上位データに順次伝播させて行く。
【００４５】
具体的には、図１０のフローチャートに示すように、リーク危険度算出部１１７は、先ず、第二回目の参照関係把握工程（Ｓ２２）で把握した全てのデータの集合を取得し（Ｓ５１）、このデータの集合から後続データのないデータを１つ取得する（Ｓ５２）。
【００４６】
続いて、この取得したデータが最上位データであるか否かを判断し（Ｓ５３）、最上位データであれば、Ｓ５６へ進み、最上位データでなければ、そのデータの重みを、そのデータの参照元である上位のデータに加算する（Ｓ５４）。そして、そのデータと上位データとの参照関係を除去した後（Ｓ５５）、データの集合が空になったか否かを判断し（Ｓ５６）、空になっていれば処理を終了し、空になっていなければ、Ｓ５２に戻る。Ｓ５２では、前述したように、データの集合から後続データのないデータを１つ取得する。この場合、先に実行したＳ５５の処理で、最下位の増加データとこれに対する上位データとの参照関係が除去され、この上位データが後続データのないデータとなるので、このデータが取得される。すなわち、Ｓ５２〜Ｓ５６の処理を繰り返すことにより、増加データの重みが順次、上位データに伝播して行く。
【００４７】
例えば、図１１に示すように、Ｓ５２の処理で、データＣ１を取得した場合には、このデータＣ１の参照元の上位データであるデータＢ１にデータＣ１の重み「１」を加えて、データＢ１の重みを「１」にする。なお、同図において、各データの右上に付されている数値が重みを示している。また、Ｓ５２の処理で、データＥ２を取得した場合には、このデータＥ２の参照元の上位データであるデータＤ０にデータＥ２の重み「２」を加える。そして、再度のＳ５２の処理で、データＥ３を取得した場合には、このデータＥ３の参照元の上位データであるデータＤ０にデータＥ３の重み「２」を加える。結局、上位データＤ０に対しては、データＥ２の重み「２」とデータＥ３の重み「２」とが加えられるので、上位データＤ０の重みは「４」となる。さらに、Ｓ５２の処理で、データＤ０を取得した場合には、このデータＤ０の上位データであるデータＢ０にデータＤ０の重み「４」を加えて、データＢ０の重みを「４」にする。最上位のデータＡ０の重みは、参照先の下位データであるデータＢ０，Ｂ１の重みが加えられるので、「５」となる。
【００４８】
Ｓ２４が終了すると、リーク危険度算出部１１７は、図４のフローチャートに示すように、最大重みのデータが２以上あるか否かを判断する（Ｓ２５）。最大重みのデータが２以上ない、つまり最大重みのデータが１つの場合には、このデータを、メモリリーク発生に関する最大危険度のデータとする（Ｓ２６）。具体的には、図１１に示すように、最大重み「５」のデータが最上位のデータＡ０のみである場合には、このデータＡ０を最大危険度のデータとする。また、最大重みのデータが２以上ある場合には、これらのデータのうちで最下位のデータを最大危険度のデータとする（Ｓ２７）。具体的には、図１２に示すように、最上位のデータＡ０の参照先のデータとして、データＢ０のみしかなく、データＤ０、データＢ０、データＡ０の全ての危険度が４の場合には、これらのデータのうち、最下位のデータＤ０を最大危険度のデータとする。
【００４９】
最大危険度のデータを求めると（Ｓ２６，２７）、最大危険度のデータ名及びその危険度、二番目に危険度の高いデータのデータ名及びその危険度、三番目に危険度の高いデータのデータ名及びその危険度を、プログラム原因箇所抽出部１１８と表示部１１９に通知する。表示部１１９には、さらに、第二回目の参照関係把握工程（Ｓ２２）で把握した全てのデータと、各データ相互の参照関係を通知する（Ｓ２８）。
【００５０】
次に、プログラム原因箇所抽出部１１８の動作について、図１３に示すフローチャートに従って説明する。
【００５１】
プログラム原因箇所抽出部１１８は、リーク危険度算出部１１７から最大危険度のデータ名及びその危険度等の通知を受けると、動作を開始し、プログラムメモリ１３０に格納されている中間言語で記述されている検査対象プログラム１３１中から、最大危険度のデータ名のデータが生成又は代入される箇所を抽出する（Ｓ６１）。この中間言語で記述されている検査対象プログラム１３１には、Java言語で記述されている検査対象プログラム１２１中の対応箇所の行番号が記述されているので、中間言語で記述されている検査対象プログラム１３１から該当箇所を抽出した後、この該当箇所の傍に設定されている行番号デーブルから、Java言語で記述されている検査対象プログラム１２１中の対応箇所の行番号を取得する（Ｓ６２）。次に、リーク危険度算出部１１７から通知された全てのデータに関して、その代入又は生成箇所の行番号を取得したか否かを判断し、全てのデータに関して行番号を取得していれば、Ｓ６４に進み、行番号を取得していないデータが残っていれば、Ｓ６１に戻る。Ｓ６４では、全てのデータに関するそれぞれの行番号を表示部１１９に通知する。
【００５２】
表示部１１９は、以上のように、リーク危険度算出部１１７、プログラム原因箇所抽出部１１８から通知された情報を、表示装置１５０に表示する。
【００５３】
具体的に、表示装置１５０には、図１４に示すように、リーク危険度ランキングウィンドウ１６０と、参照関係ウィンドウ１７０と、ソースコードウィンドウ１８０とが表示される。
【００５４】
リーク危険度ランキングウィンドウ１６０には、リーク危険度算出部１１７から通知された危険度が上位３位までのデータに関する、順位及び危険度１６１と、宣言クラス１６２と、データ名１６３と、データの所属クラス１６４と、該当データが記述されているプログラムソース名及び行番号１６５とが表示される。なお、図１４に示す例では、上から危険度が大きい順に並んでいるが、危険度の小さい順や、名前別などの表示も可能である。
【００５５】
参照関係ウィンドウ１７０には、リーク危険度検出部１１７から通知された、第二回目の参照関係把握工程で把握した全てのデータ及び各データ相互の参照関係を示す図が表示される。この参照関係図では、リーク危険度ランキングウィンドウ１６０で指定されたデータの強調表示１７１が行われる。また、参照関係を示すノード間の線１７２は、危険度に応じた太さで表示される。また、リーク危険度ランキングウィンドウ１６０で表示されたデータ１７３に関しては、他のランキング外のデータと区別するために異なる色等で表示される。また、ここでは、図示していないが、データを示すノードの傍に、リーク危険度算出１１７で求められた危険度の数値を表示してもよい。
【００５６】
ソースコードウィンド１８０には、リーク危険度ランキングウィンドウ１６０で指定されたデータに関する、Java言語で記述されている検査対象プログラム１２１中の該当行１８１、及びこの行の近傍行が表示される。これらの行の内容は、外部記憶装置１２０に記憶されているJava言語の検査対象プログラム１２１から抽出される。該当行１８１は、他の行と区別するために強調表示される。ここでは、リーク危険度ランキングウィンドウ１６０で、危険度ランキングが３位のデータ名「vec」が指定されているので、データ名「vec」が使用される行１８１が強調表示される。
【００５７】
システム管理者は、以上の表示内容を見て、例えば、Java言語で記述されている検査対象プログラム１２１の該当箇所に関して、配列クラスから該当要素データを外す、又は、該当要素データの参照関係を断ち切る等のプログラム変更処理を行うことになる。なお、参照関係が断ち切られたデータは、前述のガベージコレクション機能によりデータメモリ１４０から回収される。
【００５８】
以上のように、本実施形態では、リーク危険度の高いデータが、危険度という数値と併せて表示されると共に、そのデータの参照関係図や、Java言語で記述されている検査対象プログラム１２１中のリーク危険度の高いデータが使用される行が表示されるので、メモリリーク発生源になっているデータを特定し易い上に、プログラム１２１中から対応箇所を探し出す手間を省くことができ、メモリリーク発生源の調査にかかる労力を大幅に減らすことができる。
【００５９】
なお、以上の実施形態では、Java言語で記述されたプログラムを対象にしているが、本発明はこれに限定されるものではなく、メモリ内の領域の確保及び解放を明示的に行わず、メモリに格納された複数のデータに関して、データ相互間の参照関係をたどることができる言語で記述されたプログラムであれば、いかなる言語で記述されたプログラムであっても、本発明の対象となる。
【図面の簡単な説明】
【００６０】
【図１】本発明に係る一実施形態におけるコンピュータの構成を示す説明図である。
【図２】本発明に係る一実施形態におけるメモリリーク検出部の動作を示すフローチャートである。
【図３】時間経過に伴うメモリ使用量の変化を示す説明図である。
【図４】本発明に係る一実施形態におけるリーク危険度算出部の動作を示すフローチャートである。
【図５】本発明に係る一実施形態におけるデータメモリ中のデータ格納状態を示す説明図である。
【図６】本発明に係る一実施形態における参照関係把握工程で把握された参照関係を示す説明図で、同図（ａ）は第１回の参照関係把握工程で把握された参照関係を示し、同図（ｂ）は第２回の参照関係把握工程で把握された参照関係を示している。
【図７】図４のフローチャート中のＳ２３の詳細フローチャートである。
【図８】本発明に係る一実施形態における増加データの抽出、及びその順位付けを示す説明図である。
【図９】本発明に係る一実施形態における各増加データ毎の重みの例を示す説明図である。
【図１０】図４のフローチャート中のＳ２４の詳細フローチャートである。
【図１１】本発明に係る一実施形態における参照関係を有する各データへの重み付けについて説明するための説明図（その１）である。
【図１２】本発明に係る一実施形態における参照関係を有する各データへの重み付けについて説明するための説明図（その２）である。
【図１３】本発明に係る一実施形態におけるプログラム原因箇所抽出部の動作を示すフローチャートである。
【図１４】本発明に係る一実施形態における情報表示例を示す説明図である。
【符号の説明】
【００６１】
１…ネットワーク、１００…サーバ、１１０…プロセッサ、１１１…仮想プロセッサ、１１２…変換部、１１５…リーク原因箇所検出部、１１６…メモリリーク検出部、１１７…リーク危険度算出部、１１８…プログラム原因箇所抽出部、１１９…表示部、１２０…外部記憶装置、１２１…検査対象プログラム（Java言語での記述）、１３０…プログラムメモリ、１３１…検査対象プログラム（中間言語での記述）、１３５…リーク原因箇所検出プログラム、１４０…データメモリ、１５０…表示装置。
【図１】
2005301660.tif 000003
【図２】
2005301660.tif 000004
【図３】
2005301660.tif 000005
【図４】
2005301660.tif 000006
【図５】
2005301660.tif 000007
【図６】
2005301660.tif 000008
【図７】
2005301660.tif 000009
【図８】
2005301660.tif 000010
【図９】
2005301660.tif 000011
【図１０】
2005301660.tif 000012
【図１１】
2005301660.tif 000013
【図１２】
2005301660.tif 000014
【図１３】
2005301660.tif 000015
【図１４】
2005301660.tif 000016