(57)【特許請求の範囲】
【請求項１】
プログラムを実行するプロセッサとプログラムの実行によってアクセスされるメモリとを有する演算処理装置の該メモリ上に領域を占有する、該プロセッサにおけるプログラムの実行に応じて生成および消去されるオブジェクトのうちの、使用されないまま残存するオブジェクトを検出するメモリリーク検出方法であって、
前記プロセッサが、
前記メモリの第１領域上の領域を占有するオブジェクトを生成し、
オブジェクトを指し示すポインタの存在を各オブジェクトについて調べてポインタが不存在のオブジェクトを削除するとともに、ポインタが存在するオブジェクトについては各オブジェクトごとの各計数値をカウントアップする過程を繰り返し実行し、
前記計数値が第１閾値を越えたオブジェクトの占有領域を前記メモリの前記第１領域上の領域から前記メモリの第２領域上の領域に移動し、
前記第２領域上の領域を占有するオブジェクトの実行を受けて当該オブジェクトの占有領域を前記第１領域上の領域に移動するとともに当該オブジェクトの計数値をクリアし、
前記第２領域上の領域を占有するオブジェクトのうちの計数値が第２閾値を越えたオブジェクトを通知することを特徴とするメモリリーク検出方法。
【請求項２】
前記プロセッサは、前記第２領域のアクセスを禁止しておき、該第２領域に対するアクセス禁止違反があったことを知ることで、該第２領域上の領域を占有するオブジェクトが実行されようとしたことを検出することを特徴とする請求項１記載のメモリリーク検出方法。
【請求項３】
前記プロセッサは、前記第２領域上の領域を占有するオブジェクトの使用時に、当該オブジェクトの占有領域を前記第１領域に移動するとともに当該オブジェクトの計数値をクリアすることを特徴とする請求項１又は２記載のメモリリーク検出方法。
【請求項４】
前記プロセッサは、前記第２領域上の領域を占有するオブジェクトの使用時には該第２領域上のアクセスされたアドレスを記録しておき、前記過程の実行時に、前記第２領域上の、記録された前記アドレスを含む領域を占有するオブジェクトの占有領域を前記第１領域に移動するとともに当該オブジェクトの計数値をクリアすることを特徴とする請求項１又は２記載のメモリリーク検出方法。
【請求項５】
前記プロセッサは、前記過程実行により前記第２領域上の領域を占有するオブジェクトの計数値が前記第２閾値を越えた時点で当該オブジェクトを通知することを特徴とする請求項１から４のうちいずれか１項記載のメモリリーク検出方法。
【請求項６】
前記プロセッサは、前記第２領域上の領域を占有する、計数値が前記第２閾値を越えるオブジェクトを、使用されないまま残存するオブジェクトの通知要求を受けて通知することを特徴とする請求項１から５のうちいずれか１項記載のメモリリーク検出方法。
【請求項７】
プログラムを実行するプロセッサとプログラムの実行によってアクセスされるメモリとを有する演算処理装置であって、
前記メモリは第１領域と第２領域とを有し、前記プロセッサは前記第１領域上に領域を占有するオブジェクトを生成するものであり、
前記プロセッサが、
オブジェクトを指し示すポインタの存在を各オブジェクトについて調べてポインタが不存在のオブジェクトを削除するとともに、ポインタが存在するオブジェクトについては各オブジェクトごとの各計数値をカウントアップする過程を繰り返し実行し、
前記計数値が第１閾値を越えたオブジェクトの占有領域を前記第２領域に移動し、
前記第２領域上の領域を占有するオブジェクトの使用を受けて当該オブジェクトの占有領域を前記第１領域に移動するとともに当該オブジェクトの計数値をクリアし、
前記第２領域上の領域を占有するオブジェクトのうちの計数値が第２閾値を越えたオブジェクトを通知することを特徴とする演算処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、プログラムを実行するプロセッサとプログラムの実行によってアクセスされるメモリとを有する演算処理装置、および演算処理装置のメモリ上に領域を占有するオブジェクトのうちの、使用されずに残存するオブジェクトを検出するメモリリーク検出方法に関する。
【背景技術】
【０００２】
メモリ上にアクセスされる領域を占有するオブジェクトが生成されて使用された後、不要になったオブジェクトは消去されるのが原則である。しかしながら、例えばプログラム作成者がメモリ上の領域の確保や解放の制御を誤ったことなどの理由により、一旦生成されたオブジェクトが消去されずに残るメモリリークが発生することがある。このメモリリークが発生すると利用可能なメモリ領域が制限され、メモリリークが増えるとメモリを使い果たし、システムの停止などの問題を引き起こすおそれがある。
【０００３】
Ｊａｖａ（登録商標）言語のようにガーベジ・コレクション（Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ；  ＧＣ）を実装しているシステムでは、オブジェクトとそれを指すポインタを、プログラム作成者ではなくＧＣが管理する。そのため、プログラム作成者が領域の確保や解放の制御を誤っても、この種のメモリリークについては防ぐことができる。ＧＣは、オブジェクトを指すポインタがなくなった時点で、当該オブジェクトをごみと判断し、消去の対象とする。
【０００４】
換言すると、ＧＣは、オブジェクトを指すポインタが存在する間は当該オブジェクトを消去の対象としない。そのため、オブジェクトとそれを指すポインタが存在しているにも関わらず、プログラム上そのオブジェクトが二度と使用されない状況下では、不要なオブジェクトがメモリに残り続ける。そのようなオブジェクトが増加すると、メモリを使い果たしてしまう結果となる。これが、ＧＣを実装しているシステムであっても発生し得るメモリリークである。
【０００５】
ソフトウェアのオープン化が進んだ現在、プログラム開発者は数多くのアプリケーション・プログラミング・インタフェース（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ；  ＡＰＩ）を利用できる一方で、使用するＡＰＩの内部まで詳細に理解することが難しくなっている。そのため、ＡＰＩの使用方法を誤ったりすると、不要なオブジェクトであるがポインタが存在している結果その不要なオブジェクトが存在し続けるタイプのメモリリークが発生することがある。
【０００６】
メモリリークを検出する方法として、Ｊａｖａ（登録商標）言語を例に挙げると、Ｏｒａｃｌｅ  ＪＲｏｃｋｉｔ  Ｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ（Ｍｅｍｏｒｙ  Ｌｅａｋ  Ｄｅｔｅｃｔｏｒ）やＩＢＭ  ＨｅａｐＡｎａｌｙｚｅｒが知られている。
【０００７】
Ｏｒａｃｌｅ  ＪＲｏｃｋｉｔ  Ｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ（Ｍｅｍｏｒｙ  Ｌｅａｋ  Ｄｅｔｅｃｔｏｒ）は、同一クラスのインスタンスが単位時間に大量に増加している場合に、そのクラス名およびオブジェクトを、メモリリークの候補として、利用者に通知する。
【０００８】
また、ＩＢＭ  ＨｅａｐＡｎａｌｙｚｅｒは、ＧＣが終了した時点で、同一クラスのインスタンスがメモリに大量に存在している場合に、そのクラス名とオブジェクトの情報を、メモリリークの候補として、利用者に提供する。
【０００９】
これらのメモリリーク検出方法には、次の問題がある。
・少量のメモリリークを検出できない。例えば、１個だけリークしているオブジェクトを検出できない。
・過去のメモリリークを検出できない。メモリリークを定期的に繰り返すようなアプリケーションの場合、メモリがリークしていないときにツールを使用しても、リークを検出できない。
・メモリに大量に残存するオブジェクトが、リークしているとは限らない。暫くの間使用されていなくてもある時点に達すると使用されるようにプログラムされているオブジェクトが存在する可能性もある。したがって、メモリリークが発生しているか否かは、ある程度の時間、そのオブジェクトの情報を観察する必要がある。
【００１０】
また、全てのオブジェクトに対する全てのアクセス情報をメモリのページごとに記録し、アクセスの頻度でメモリリークを検出する方法が知られている。しかしながら全てのオブジェクトに対する全てのアクセスを監視するのでは、システムの実行に大きな負荷がかかる。また、ページごとの記録では、アクセス頻度の異なるオブジェクトが同じページに配置されている場合にはリーク検出の精度を損なうことになる。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００９−２６０８１号公報
【非特許文献】
【００１２】
【非特許文献１】ｈｔｔｐ：／／ｅｄｏｃｓ．ｂｅａｓｙｓ．ｃｏ．ｊｐ／ｅ−ｄｏｃｓ／ｊｒｏｃｋｉｔ／ｔｏｏｌｓ／ｉｎｄｅｘ．ｈｔｍｌ
【非特許文献２】ｈｔｔｐ：／／ｅｄｏｃｓ．ｂｅａ．ｃｏｍ／ｊｒｏｃｋｉｔ／ｔｏｏｌｓ／ｉｎｄｅｘ．ｈｔｍｌ
【非特許文献３】ｈｔｔｐ：／／ｗｗｗ．ａｌｐｈａｗｏｒｋｓ．ｉｂｍ．ｃｏｍ／ｔｅｃｈ／ｈｅａｐａｎａｌｙｚｅｒ
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本件開示のメモリリーク検出方法および演算処理装置の課題は、ポインタが存在するにもかかわらず使用されていないオブジェクトを低負荷で検出することにある。
【課題を解決するための手段】
【００１４】
本件開示のメモリリーク検出方法は、プログラムを実行するプロセッサとプログラムの実行によってアクセスされるメモリとを有する演算処理装置で実行される検出方法である。このメモリリーク検出方法では、メモリ上に領域を占有し、プロセッサにおけるプログラムの実行に応じて生成および消去されるオブジェクトのうちの、使用されないまま残存するオブジェクトが検出される。
【００１５】
尚、本件開示のメモリリーク検出方法にいうメモリは、オブジェクトによる領域占有の対象となるメモリであって、必ずしも主メモリに限られるものではない。例えばそのオブジェクトがＨＤＤ（ハードディスクドライブ）等の記憶部内の領域を占有対象とする場合は、そのＨＤＤ等の記憶部も本件にいうメモリに該当する。
【００１６】
ここで、本件開示のメモリリーク検出方法において、上記プロセッサは、下記の（１）〜（５）を実行する。
【００１７】
（１）上記メモリの第１領域上の領域を占有するオブジェクトを生成する。
【００１８】
（２）以下の過程を繰り返し実行する。この過程では、オブジェクトを指し示すポインタの存在が各オブジェクトについて調べられてポインタが不存在のオブジェクトが削除される。また、これとともに、この過程では、ポインタが存在するオブジェクトについては各オブジェクトごとの各計数値がカウントアップされる。
【００１９】
（３）上記計数値が第１閾値を越えたオブジェクトの占有領域を上記メモリの第１領域上の領域から上記メモリの第２領域上の領域に移動する。
【００２０】
（４）第２領域上の領域を占有するオブジェクトの使用を受けてそのオブジェクトの占有領域を第１領域上の領域に移動するとともにそのオブジェクトの計数値をクリアする。
【００２１】
（５）第２領域上の領域を占有するオブジェクトのうちの計数値が第２閾値を越えたオブジェクトを通知する。
【００２２】
また、本件開示の演算処理装置は、上記のメモリリーク検出方法を実行する装置である。
【発明の効果】
【００２３】
本件開示のメモリリーク検出方法および演算処理装置によれば、基本的には上記（２）の過程の実行回数を計数することによってメモリリークを検出している。オブジェクトに対するアクセスは、上記の第２領域に移されたオブジェクトのみ監視対象とすればよく、低負荷でメモリリークが検出される。
【図面の簡単な説明】
【００２４】
【図１】演算処理装置の構成を示す図である。
【図２】オブジェクト生成手順のフローチャートである。
【図３】オブジェクトの構造を示す構成図である。
【図４】スタックトレース情報の構造を示す模式図である。
【図５】メモリ上の領域Ａと領域Ｂを示す模式図である。
【図６】オブジェクト削除手順のフローチャートである。
【図７】オブジェクトの移動を示す模式図である。
【図８】領域Ｂにあるオブジェクトの実行時の処理の説明図である。
【図９】アプリケーションプログラムで領域Ｂに存在するオブジェクトがアクセスされたときに実行される処理を示すフローチャートである。
【図１０】ハンドル処理を示すフローチャートである。
【図１１】ＧＣ処理のメインルーチンを示すフローチャートである。
【図１２】図１１のステップＳ４２における、領域Ｂから領域Ａへのオブジェクトの移動処理を示すフローチャートである。
【図１３】図１１のステップＳ４３における、オブジェクトの削除および領域Ａから領域Ｂへの移動処理を示すフローチャートである。
【図１４】図１１のステップＳ４４における、メモリリークの可能性のあるオブジェクトの情報出力処理を示すフローチャートである。
【図１５】図１４のステップＳ４４３で出力されたメモリリークの可能性のあるオブジェクトの情報の一例を示す図である。
【図１６】メモリリークの可能性の高いオブジェクトについての情報出力処理の変形例を示す図である。
【図１７】オブジェクトの、領域Ｂから領域Ａへの移動処理の変形例を示すフローチャートである。
【発明を実施するための形態】
【００２５】
以下、本件の実施形態を説明する。
【００２６】
図１は、一実施形態としての演算処理装置の構成を示す図である。
【００２７】
図１の最下部にはハードウェア構成が示されている。ここでは、通常の構成のパーソナルコンピュータ（Ｐｅｒｓｏｎａｌ  Ｃｏｎｐｕｔｅｒ  ＰＣ）が想定されている。ハードウェア２０としては、プロセッサ２１、メモリ２２、入力装置２３、および出力装置２４を有する。プロセッサ２１ではプログラムが実行される。メモリ２２はデータの記憶を担っており、プログラムの実行によってアクセス（データの書込みや読出し）が行なわれる。このメモリ２２は、本実施形態では、プロセッサ２１での実行対象のプログラムが格納される主メモリである。ただし、本件では主メモリに限定される必要はなく、例えばＨＤＤ（ハードディスクドライブ）等の記憶部であってもよい。
【００２８】
また入力装置２３は、キーボードやマウスなどのユーザの操作を受ける入力装置や通信回線等を経由してこの演算処理装置１０の外部から指示を受ける受信装置等を含む。
【００２９】
また出力装置２４は、この演算処理装置１０の利用者に向けて画像を表示する画像表示装置および利用者に向けて音声で通知するスピーカ、並びに、通信回線等を通じてこの演算処理装置１０の外部に情報を伝える送信装置等を含む。
【００３０】
このハードウェア２０上ではオペレーティング・システム（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  ＯＳ）３０が実行され、そのＯＳによる制御の下でソフトウェアとしてのプロセス４０が実行される。ＯＳ３０はプロセス４０の制御全般を担っているが、本実施形態で特に着目すべき制御としては、「ハンドル処理呼び出し」や「アクセス保護の変更」の制御がある。詳細は後述する。
【００３１】
プロセス４０は、通信部４１、ハンドル処理実行部４２、アプリケーション実行部４３、ＧＣ実行部４４、およびメモリ管理部４５を有する。また、このプロセス４０では、スタックトレース情報４６およびアクセスしたアドレスのリスト４７が管理されている。
【００３２】
この演算処理装置１０は、ハードウェア２０、ＯＳ３０、およびここに示すプロセス４０の他、さらに各種のアプリケーションプログラム等を有する。
【００３３】
プロセス４０を構成する通信部４１は、このプロセス４０と他のプロセスや入力装置２３との間の通信を担うスレッドである。
【００３４】
ハンドル処理実行部４２は、詳細は後述するが、メモリ２２上の、アクセス禁止状態にある領域Ｂに対するアクセス違反が発生したときのハンドル処理の実行を担っている。
【００３５】
アプリケーション実行部４３は各種のアプリケーションが実行される際に起動されるスレッドである。
【００３６】
ＧＣ実行部４４は、ＧＣを繰り返し実行する。ここで、このＧＣ実行部４４は、ＧＣ経験回数計数部４４１を有する。このＧＣ経験回数計数部４４１では、オブジェクトごとのＧＣの経験回数が計数される。詳細は後述する。
【００３７】
また、メモリ管理部４５では、ハードウェア２０上のメモリ２２上に領域Ａと領域Ｂを設定しそれらの領域Ａ，Ｂを管理する。これらの領域Ａ，Ｂの利用方法については後述する。スタックトレース情報４６およびアクセスしたアドレスのリスト４７についても後述する。
【００３８】
図２は、オブジェクト生成手順のフローチャートである。
【００３９】
アプリケーションプログラムが実行され、そのアプリケーションプログラムでオブジェクトの生成が指示されると、アプリケーション実行部４３では、図２にフローチャートを示す処理が実行される。
【００４０】
ここでは、図２のフローチャートの説明にあたり必要となる、オブジェクトの構造等について説明する。
【００４１】
図３は、オブジェクトの構造を示す構成図である。
【００４２】
このオブジェクトは、データの書込みや読出しが行なわれるデータ部分のほか、さらにヘッダ部分を有する。このヘッダ部分にはＧＣ経験回数とスタックトレース情報へのポインタが記録される。
【００４３】
図４はスタックトレース情報の構造を示す模式図である。
【００４４】
ここには、メソッドを表わすメソッド情報が、呼出し元のメソッドから呼出し先のメソッドの順にスタックされている。各メソッド情報は、そのメソッドの名前と、プログラム中の、そのメソッドが存在する行を特定する数値（行数）とからなる。１つのメソッドはそこに記録された名前と行数とで特定される。
【００４５】
ここで、それらのメソッド情報１，２，…，Ｎのうちの一番上にスタックされたメソッド情報１が、オブジェクトを今回生成したメソッドである。このスタックトレース情報にはさらに「参照カウント」が存在する。この「参照カウント」は複数回生成されたオブジェクトが同一のスタックトレース情報を持つ場合に、同一のスタックトレース情報を複数作ることを避けるためのカウンタである。この「参照カウント」にｎ（ｎは正の数）が記録されているときは、この１つのスタックトレース情報がｎ個のオブジェクトに共通のスタックトレース情報であることを表わしている。
【００４６】
図５は、メモリ上の領域Ａと領域Ｂを示す模式図である。
【００４７】
オブジェクトは、領域Ａ内の一部領域を占有するように生成される。領域Ｂは、オブジェクトの生成時には使用されないが、一旦生成されたオブジェクトが領域Ｂ内の領域を占有するようにその占有領域が移されることがある。この点については後述する。
【００４８】
以上の、図３〜図５の説明を踏まえて、図２のフローチャートを説明する。
【００４９】
ここでは先ず、オブジェクトの生成が行なわれる（ステップＳ１１）。上述の通り、このオブジェクトの生成にあたっては、データの書込みや読出しを行なう領域として、領域Ａ内の領域がそのオブジェクトに割り当てられる。このオブジェクトは、図３に示すヘッダ部分を有し、そのヘッダ部分に設定されたＧＣ経験回数が初期値（ここではゼロ）に設定される（ステップＳ１２）。
【００５０】
次にオブジェクトを今回生成したメソッドの呼び出し関係（図４参照）を取得し（ステップＳ１３）、今回のオブジェクトが参照すべきスタックトレース情報と同じスタックトレース情報が存在するか否かが判定される（ステップＳ１４）。同じスタックトレース情報が存在しないときは、今回生成されたオブジェクト用のスタックトレース情報が生成され（ステップＳ１５）、そのスタックトレース情報の参照カウントを‘１’とし（ステップＳ１６）、そのスタックトレース情報のアドレスが、今回生成されたオブジェクトのヘッダに設定される（ステップＳ１８）。
【００５１】
ステップＳ１４で同じスタックトレース情報が既に存在すると判定されると、その同じスタックトレース情報の参照カウントに‘１’が加算され（ステップＳ１７）、その同じスタックトレース情報のアドレスが、オブジェクトのヘッダに設定される（ステップＳ１８）。
【００５２】
図６は、オブジェクト削除手順のフローチャートである。
【００５３】
この図６は、オブジェクトがＧＣによって削除される場合のフローチャートである。すなわち、オブジェクトを指し示すポインタがなくなると、ＧＣ実行部４４（図１参照）では図６のフローチャートに従う処理が実行される。
【００５４】
ここでは、その削除が決定されたオブジェクトのヘッダに記録されているスタックトレース情報のポイントにより指し示されているスタックトレース情報の参照カウント（図４参照）が‘１’減じられる（ステップＳ２１）。次いで、‘１’減じた後の参照カウントがゼロであるか１以上であるかが判定され（ステップＳ２２）、参照カウントがゼロのときはそのスタックトレース情報が削除され（ステップＳ２３）、さらに削除が指示されたオブジェクト自体が削除される（ステップＳ２４）。ステップＳ２２で、スタックトレース情報の参照カウントが１以上であると判定されたときは、スタックトレース情報は残したまま、削除が指示されたオブジェクトが削除される（ステップＳ２４）。
【００５５】
図７は、オブジェクトの移動を示す模式図である。
【００５６】
前述した通り、オブジェクトの生成にあたっては、そのオブジェクトの占有領域が領域Ａ内となるように設定される。以降では、これをオブジェクトが領域Ａに配置される、と称する。後述するＧＣの繰返しにより、一定回数以上ＧＣを経験したオブジェクトはその占有領域が領域Ｂ内となるように変更される。ここでは、これをオブジェクトが領域Ｂに移動される、と称する。
【００５７】
領域Ｂに移動したオブジェクトがアクセスされると、そのオブジェクトは領域Ａに戻される。
【００５８】
図８は、領域Ｂにあるオブジェクトの実行時の処理の説明図である。
【００５９】
ここで採用されているオブジェクトへのアクセスの検出方法は、ＯＳが提供している、メモリのアクセス保護を変更する機能を利用するものである。メモリのアクセス保護を変更するＯＳの機能としては、ＳｏｌａｒｉｓやＬｉｎｕｘのｍｐｒｏｔｅｃｔ、Ｗｉｎｄｏｗｓ（登録商標）のＶｉｒｔｕａｌＰｒｏｔｅｃｔなどがある。
【００６０】
まず、領域Ｂのアクセス保護を、読み取り・書き込みともに不可としておく。また、アクセス違反発生時のハンドル処理を設定しておく。
【００６１】
この状態で領域Ｂに存在するオブジェクトがアクセスされると、ＯＳはアクセス違反を検出し、設定されたハンドル処理が実行される。このハンドル処理では、領域Ｂのアクセス保護が、読み取り・書き込みともに可能な状態に変更され、当該オブジェクトへのアクセスが実行される。また、アクセスしたアドレスがリストに追加される。その後、領域Ｂのアクセス保護が、読み取り・書き込みともに不可の状態に戻される。ここでハンドル処理が終了し、元の処理に戻る。
【００６２】
そして、次回のＧＣで、リストに含まれるアドレスを含むオブジェクトが領域Ａに移動されるとともにそのオブジェクトのＧＣ経験回数が初期値に変更される。
【００６３】
以上の、領域Ｂにあるオブジェクトの実行時の処理をフローチャートに沿って説明する。
【００６４】
図９は、アプリケーションプログラムで領域Ｂに存在するオブジェクトがアクセスされたときに実行される処理を示すフローチャートである。
【００６５】
アプリケーションプログラムによって領域Ｂに存在するオブジェクトがアクセスされると（ステップＳ３１）、アクセス違反が発生し（ステップＳ３２）、ハンドル処理が実行される（ステップＳ３３）。ハンドル処理終了後はそのアプリケーションプログラムに応じた処理が継続される（ステップＳ３４）。
【００６６】
図１０は、ハンドル処理を示すフローチャートである。
【００６７】
図９のステップＳ３３におけるハンドル処理では、先ず、領域Ｂのアクセス保護が、読み取り・書き込みともに可能な状態に変更され（ステップＳ３３１）、当該オブジェクトの読み取り、または当該オブジェクトへの書き込みが実行される（ステップＳ３３２）。さらに、領域Ｂの、今回アクセスしたアドレスがリスト（図８参照）に追加され（ステップＳ３３３）、領域Ｂのアクセス保護が、再び、読み取り・書き込みともに不可の状態に変更される（ステップＳ３３４）。
【００６８】
本実施形態では、オブジェクトの、領域Ｂから領域Ａへの移動はこのハンドル処理の時点では行なわれずに、次回のＧＣ処理実行時点で行なわれる。
【００６９】
図１１は、ＧＣ処理のメインルーチンを示すフローチャートである。
【００７０】
図１に示すＧＣ実行部４４では、以下に説明するＧＣ処理が繰り返し実行される。このＧＣ処理は、一定周期で繰り返し実行されてもよく、あるいは、例えばプロセッサ２１（図１参照）の稼働率が少し低下したタイミングなど不定期に繰り返し実行されてもよい。
【００７１】
図１１に示すＧＣ処理では、先ず領域Ｂのアクセス禁止が解除される（ステップＳ４１）。すなわち、ここでは領域Ｂのメモリ保護属性が書き込み・読み出しともに可能に変更される。
【００７２】
次いで、領域Ｂから領域Ａへのオブジェクトの移動処理が行われる（ステップＳ４２）。すなわち、ここでは領域Ｂの、アクセスされたアドレスが記録されたリスト（図８参照）が参照され、そのリストに記録されたアドレスのいずれかを含むオブジェクトが領域Ｂから領域Ａに移動される。
【００７３】
さらに、不要なオブジェクトの削除と、領域Ａにある、ＧＣ経験回数の多いオブジェクトの領域Ｂへの移動処理が行なわれる（ステップＳ４３）。さらに、領域Ｂにある、メモリリークの可能性があるオブジェクトの情報の出力処理が行われる（ステップＳ４４）。そして最後に、領域Ｂのアクセスが再び禁止される（ステップＳ４５）。
【００７４】
図１２は、図１１のステップＳ４２における、領域Ｂから領域Ａへのオブジェクトの移動処理を示すフローチャートである。
【００７５】
ここでは、領域Ｂにあるオブジェクト１つずつに順次着目しながら、着目したオブジェクトについて以下の処理が行なわれる（ステップＳ４２１）。
【００７６】
先ず着目したオブジェクトが、アクセスしたアドレスのリスト（図８参照）に記録されているアドレスのうちのいずれかのアドレスを含んでいるか否かが判定される（ステップＳ４２２）。着目したオブジェクトがそのリスト中のアドレスとは無関係のオブジェクトであるときは、ステップＳ４２１に戻り、次のオブジェクトに着目する。
【００７７】
一方、着目したオブジェクトがそのリスト中のアドレスのいずれかを含むオブジェクトであったときは（ステップＳ４２２）、その着目オブジェクトのＧＣ経験回数が０にクリアされ（ステップＳ４２３）、その着目オブジェクトが領域Ｂから領域Ａに移動されて（ステップＳ４２４）、その後、ステップＳ４２１に戻り、次のオブジェクトに着目する。      
【００７８】
領域Ｂに存在する全てのオブジェクトについて処理が終了すると、このルーチンを抜ける（ステップＳ４２１）。
【００７９】
図１３は、図１１のステップＳ４３における、オブジェクトの削除および領域Ａから領域Ｂへの移動処理を示すフローチャートである。
【００８０】
ここでは、領域Ａと領域Ｂのいずれに存在するオブジェクトについても順次１つずつ着目し、その着目したオブジェクトについて以下の処理が行なわれる（ステップＳ４３１）。
【００８１】
先ず、着目したオブジェクトを指し示すポインタが存在するか否かが判定される（ステップＳ４３２）、そのオブジェクトを指し示すポインタが存在しないときは、そのオブジェクトがメモリから削除される（ステップＳ４３３）。その後ステップＳ４３１に戻って次のオブジェクトに着目し、その新たな着目オブジェクトについて同様の処理が実行される。これらのステップＳ４３２，Ｓ４３３における、ポインタの存在の有無のサーチおよびポインタが存在しないオブジェクトの削除処理は、ガーベジコレクション（ＧＣ）としての従来より知られた基本処理であり、詳細説明は省略する。
【００８２】
ステップＳ４３２において、その着目オブジェクトを指すポインタが存在すると判定されると、その着目オブジェクトのＧＣ経験回数（図３参照）に‘１’が加算される（ステップＳ４３４）。さらに、そのオブジェクトが領域Ａにあるオブジェクトであるか領域Ｂにあるオブジェクトであるかが判定される（ステップＳ４３５）。領域Ａにあるオブジェクトでない（領域Ｂにあるオブジェクトである）ときは、ステップＳ４３１に戻る。領域Ａにあるオブジェクトの場合はさらにステップＳ４３６に進み、ここでは、そのオブジェクトのＧＣ経験回数が閾値を越えたか否かが判定される（ステップＳ４３６）。この閾値は本件における第１閾値の一例である。そのオブジェクトのＧＣ経験回数がまだ閾値を越えていないときはステップＳ４３１に戻り、閾値を越えていたときは、そのオブジェクトが領域Ｂに移動された後（ステップＳ４３７）、ステップＳ４３１に戻る。
【００８３】
領域Ａおよび領域Ｂにある全てのオブジェクトについて上記の処理が終了すると、このルーチンを抜ける（ステップＳ４３１）。
【００８４】
図１４は、図１１のステップＳ４４における、メモリリークの可能性のあるオブジェクトの情報出力処理を示すフローチャートである。
【００８５】
ここでは領域Ｂにあるオブジェクト１つずつに順次着目しながら、着目したオブジェクトについて以下の処理が行なわれる（ステップＳ４４１）。
【００８６】
領域Ｂにある着目オブジェクトのＧＣ経験回数が調べられ、そのＧＣ経験回数から閾値（図１３のステップＳ４３６で用いた閾値）を引いた値が既定の値以上であるか否かが判定される（ステップＳ４４２）。これらの「閾値」と「既定の値」を加えた値が、本件における第２閾値の一例である。
【００８７】
オブジェクトのＧＣ経験回数から閾値を引いた値が既定の値に達していないときはステップＳ４４１に戻り、領域Ｂにある次のオブジェクトに着目して同様の処理を行なう。
【００８８】
一方、オブジェクトのＧＣ経験回数から閾値を引いた値が規定の値以上であったときはそのオブジェクトの情報が出力され（ステップＳ４４３）、その後ステップＳ４４１に戻る。
【００８９】
領域Ｂにある全てのオブジェクトについて上記の処理が終了すると、このルーチンを抜ける。
【００９０】
図１５は、図１４のステップＳ４４３で出力されたメモリリークの可能性のあるオブジェクトの情報の一例を示す図である。
【００９１】
ここでは、情報出力の一形態として、この図１５に示すような情報が図１の演算処理装置１０の出力装置２４を構成する画像表示装置の表示画面上に表示される。
【００９２】
この図５に示す表示内容の１行目は、ＧＣ処理を１０００回経験する間、一度もアクセスされていないオブジェクトであることが示されており、２行目以降は、そのオブジェクト生成の経緯（図４参照）が示されている。
【００９３】
以上で本件の実施形態について説明を終了し、以下ではその実施形態に対する各変形例を説明する。以下の各変形例の説明では、上記の実施形態と相違する点のみ取り挙げて説明する。
【００９４】
前述の実施形態では、情報出力処理はＧＣ処理の中（図１１，図１４参照）で行なわれている。このＧＣ処理の中で行なうことに加えて、あるいはＧＣ処理では情報出力処理は行なわずに、以下に説明するようにして情報出力処理を行なってもよい。
【００９５】
図１６は、メモリリークの可能性の高いオブジェクトについての情報出力処理の変形例を示す図である。
【００９６】
この図１６では、図１にも示すプロセス４０中の通信部４１に対し、他のプロセスから、リークしているオブジェクトの情報が要求され、その要求を受けて、その要求を行なったプロセスに向けて、リークしているオブジェクトの情報が返却されることが示されている。またこの図１６には、この演算処理装置１０（図１参照）の利用者が入力装置２３を操作してリークしているオブジェクトの情報出力を要求し、それを受けて、リークしているオブジェクトの情報を画面やファイルに出力することが示されている。
【００９７】
このように、リークしているオブジェクトの情報の要求があったときに図１４に相当する処理を実行し、その情報を出力する構成としてもよい。
【００９８】
ＧＣ処理中では情報出力処理を行なわないときは、図１１のステップＳ４４の処理、すなわち図１４の処理は、ＧＣ処理からは除外される。
【００９９】
図１７は、オブジェクトの、領域Ｂから領域Ａへの移動処理の変形例を示すフローチャートである。
【０１００】
この図１７は、上述の実施形態における、図１０に示すハンドル処理に代えて採用されるハンドル処理を示している。
【０１０１】
図９のステップＳ３３として、この図１７に示すハンドル処理を採用した場合は、図１０のハンドル処理は不要であり、さらに図１１に示すＧＣ処理のうちのステップＳ４２の処理、すなわち図１２に示す処理も不要となる。さらに図８に示すリストの作成も不要である。
【０１０２】
図１７に示すハンドル処理では、先ず、領域Ｂのアクセス保護が、読み取り・書き込みともに可能な状態に変更される（ステップＳ３３５）。次いで、図１２のステップＳ３１でアクセスされた領域Ｂに存在するオブジェクトが領域Ａに移動され（ステップＳ３３６）、領域Ｂのアクセス保護が、読み取り・書き込みともに不可の状態に変更される（ステップＳ３３７）。さらに、領域Ａに移動したオブジェクトのＧＣ経験回数が０にクリアされ（ステップＳ３３８）、そのオブジェクトの読み取り、またはそのオブジェクトへの書き込みが実行される（ステップＳ３３９）。
【０１０３】
前述した実施形態では、領域Ｂから領域Ａへの移動処理をＧＣ処理部で行なっていたが、この図１７に示すようにハンドル処理部で行なってもよい。ハンドル処理部で行なうと図８に示すリストの作成処理等が不要であり、処理が簡素化される。ただし、この場合、アプリケーションプログラム実行中におけるハンドル処理という、優先度を上げた例外処理で行なうこととなり、その分、処理負荷が増える。これに対しＧＣ処理は、アプリケーションなどの処理に余裕があるタイミングで実行することができ、負荷の増加が抑えられる。
【０１０４】
ただし、これらの実施形態および変形例のいずれにおいても、領域Ｂにあるオブジェクトのアクセスのみ監視対象とすればよく、メモリリークを低負荷で検出することができる。
【符号の説明】
【０１０５】
１０    演算処理装置
２０    ハードウェア
２１    プロセッサ
２２    メモリ
２３    入力装置
２４    出力装置
３０    オペレーティング・システム（ＯＳ）
４０    プロセス
４１    通信部
４２    ハンドル処理実行部
４３    アプリケーション実行部
４４    ＧＣ実行部
４５    メモリ管理部
４６    スタックトレース情報
４７    リスト
４４１    ＧＣ経験回数計数部
【図１】
0005459009.tif 000002
【図２】
0005459009.tif 000003
【図３】
0005459009.tif 000004
【図４】
0005459009.tif 000005
【図５】
0005459009.tif 000006
【図６】
0005459009.tif 000007
【図７】
0005459009.tif 000008
【図８】
0005459009.tif 000009
【図９】
0005459009.tif 000010
【図１０】
0005459009.tif 000011
【図１１】
0005459009.tif 000012
【図１２】
0005459009.tif 000013
【図１３】
0005459009.tif 000014
【図１４】
0005459009.tif 000015
【図１５】
0005459009.tif 000016
【図１６】
0005459009.tif 000017
【図１７】
0005459009.tif 000018