資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラム
【課題】コンピュータ資源の解放漏れを早期に検知し、かつ、コンピュータ資源使用量増加率の大小にかかわらず、コンピュータ資源解放漏れ有無の誤判定を行うおそれを少なくする。
【解決手段】メモリリーク判定装置(資源解放漏れ判定装置)1において、メモリ使用量取得部(資源使用量取得部)21が、各プロセスのメモリ使用量(資源使用量)を取得し、最大値更新回数計数部22が、メモリ使用量の最大値更新回数をプロセス毎に計数する。メモリリーク判定部(資源解放漏れ判定部)23は、メモリ使用量の最大値更新回数が所定の閾値以上、かつ、メモリ使用量が所定の閾値以上の場合に、メモリリーク(資源解放漏れ)有りと判定する。
【解決手段】メモリリーク判定装置(資源解放漏れ判定装置)1において、メモリ使用量取得部(資源使用量取得部)21が、各プロセスのメモリ使用量(資源使用量)を取得し、最大値更新回数計数部22が、メモリ使用量の最大値更新回数をプロセス毎に計数する。メモリリーク判定部(資源解放漏れ判定部)23は、メモリ使用量の最大値更新回数が所定の閾値以上、かつ、メモリ使用量が所定の閾値以上の場合に、メモリリーク(資源解放漏れ)有りと判定する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムに関する。
【背景技術】
【0002】
プログラムのバグやウィルスの混入など何らかの原因で、オペレーティングシステム(Operating System;OS)やアプリケーションソフトのプロセスが、動的に確保したメモリ領域を開放しない現象は、メモリリークと呼ばれている。メモリリークが生じると、使用可能なメモリ領域が減少してコンピュータの処理能力が低下する、あるいは、コンピュータの動作が不安定になるおそれがある。
メモリリークの有無を判定する方法として、プロセス毎のメモリ使用量を検出し、いずれかのプロセスのメモリ使用量が所定の閾値を超えた場合に、メモリリーク有りと判定する方法がある。しかし、この方法では、メモリ使用量が当該閾値を超えるまでメモリリーク有りとの判定が行われず、メモリリークの検知が遅れてしまう。また、実際にはメモリリークが発生しておらず、メモリ使用量が一時的に閾値を超えたに過ぎない場合も、メモリリーク有りとの誤検出を行ってしまう。
そこで、特許文献1では、プロセス毎に、直近24時間のメモリ使用量平均値と過去のメモリ使用量平均値とを比較してメモリ使用量増加率を算出し、いずれかのプロセスのメモリ使用量増加率が予め定められた閾値を超える場合に、メモリリーク有りと判定する方法が示されている。この方法によれば、メモリ使用量増加率に基づいてメモリリークの有無を判定するので、メモリ使用量が比較的小さい早期段階でメモリリークを検知し得る。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2005-250751号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、特許文献1の方法では、比較的大きなメモリ領域を確保するプロセスが一定時間以上(例えば、直近24時間近く)実行状態にある場合にも、メモリ使用量増加率が閾値を超えることが考えられる。この場合、実際にはメモリリークが発生していないにもかかわらず、メモリリーク有りとの誤判定を行ってしまうおそれがある。また、この方法では、メモリ使用量増加率が閾値以下のメモリリークを検出することはできない。
【0005】
また、かかる課題は、メモリ資源に限らず様々なコンピュータ資源について生じうる。例えば、プロセスがオープンしたファイルのクローズ漏れの有無を、プロセスがオープンしたファイル数と閾値との比較により判定する場合や、マルチスレッド処理を行うプロセスのスレッド終了漏れを、スレッド数と閾値との比較により判定する場合も、上記の場合と同様に、オープンファイル数やスレッド数の一時的な増加により誤判定を行ってしまうおそれがある。
【0006】
本発明は、このような事情を考慮してなされたものであり、その目的は、コンピュータ資源の解放漏れを早期に検知し、かつ、コンピュータ資源使用量増加率の大小にかかわらず、コンピュータ資源解放漏れ有無の誤判定を行うおそれの少ない資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムを提供することにある。
【課題を解決するための手段】
【0007】
この発明は上述した課題を解決するためになされたもので、本発明の一態様による資源解放漏れ判定装置は、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置であって、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得部と、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数部と、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定部と、を具備することを特徴とする。
【0008】
また、本発明の一態様による資源解放漏れ判定方法は、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置の資源漏れ判定方法であって、コンピュータ資源使用量取得部が、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、最大値更新回数計数部が、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、解放漏れ判定部が、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、を具備することを特徴とする。
【0009】
また、本発明の一態様によるプログラムは、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置としてのコンピュータに、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、を実行させるためのプログラムである。
【発明の効果】
【0010】
本発明によれば、コンピュータ資源の解放漏れを早期に検知し、かつ、コンピュータ資源使用量増加率の大小にかかわらず、コンピュータ資源解放漏れ有無の誤判定を行うおそれを少なくできる。
【図面の簡単な説明】
【0011】
【図1】本発明の一実施形態におけるメモリリーク判定装置の概略構成を示す構成図である。
【図2】同実施形態において、プロセス情報記憶部311が記憶するプロセス情報の例を示す図である。
【図3】同実施形態において、メモリ使用量情報記憶部312が記憶するメモリ使用量情報の例を示す図である。
【図4】同実施形態において、判定条件情報記憶部313が記憶する判定条件情報の例を示す図である。
【図5】同実施形態において、処理内容情報記憶部314が記憶する処理内容情報の例を示す図である。
【図6】同実施形態において、処理結果情報記憶部315が記憶する処理結果情報の例を示す図である。
【図7】同実施形態において、メモリリーク判定部23が、メモリリーク有りと判定する例を示すグラフである。
【図8】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第1の例を示すグラフである。
【図9】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第2の例を示すグラフである。
【図10】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第3の例を示すグラフである。
【図11】同実施形態において、メモリリーク判定装置1が、ある1つのプロセスに関して行う、メモリリーク有無の判定処理手順を示す図である。
【図12】本発明の第1の変形例におけるファイルリーク判定装置の概略構成を示す構成図である。
【図13】本発明の第2の変形例におけるスレッドリーク判定装置の概略構成を示す構成図である。
【発明を実施するための形態】
【0012】
以下、図面を参照して、本発明の実施の形態について説明する。
図1は、本発明の一実施形態におけるメモリリーク判定装置の概略構成を示す構成図である。同図において、メモリリーク判定装置(資源解放漏れ判定装置)1は、操作入力部11と、表示部12と、メモリ使用量取得部(コンピュータ資源使用量取得部)21と、最大値更新回数計数部22と、メモリリーク判定部(解放漏れ判定部)23と、対策処理実行部24と、記憶部31とを具備する。記憶部31は、プロセス情報記憶部311と、メモリ使用量情報記憶部312と、判定条件情報記憶部313と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
【0013】
メモリリーク判定装置1は、コンピュータ上のプロセスのメモリ使用量に基づいて、メモリリークの有無を判定する。
記憶部31は、メモリリーク判定対象のコンピュータ(以下では、単に「コンピュータ」という)の記憶領域上に実現されて、各種情報を記憶する。プロセス情報記憶部311は、メモリリーク判定装置1が各プロセスのメモリ使用量を取得するために用いる情報であるプロセス情報をプロセス毎に記憶する。
図2は、プロセス情報記憶部311が記憶するプロセス情報の例を示す図である。同図の例では、プロセス情報には、プロセスの識別番号である「プロセスID」と、当該プロセスの「プロセス名」と、当該プロセスの「実行開始時刻」と、メモリリーク判定装置1が次に当該プロセスのメモリ使用量を取得する時刻である「次回時刻」とが含まれている。
【0014】
メモリ使用量情報記憶部312は、実行中のプロセスのメモリ使用量に関する情報であるメモリ使用量情報をプロセス毎に記憶する。
図3は、メモリ使用量情報記憶部312が記憶するメモリ使用量情報の例を示す図である。同図の例では、メモリ使用量情報には、上述した「プロセスID」および「プロセス名」と、当該プロセスのメモリ使用量の「初期値」および「最大値」および「現在値」と、当該最大値が更新された回数を示す「最大値更新回数」と、メモリリーク判定装置1がメモリリークの判定を行う際に用いる閾値である「メモリ使用量閾値」とが含まれている。
【0015】
判定条件情報記憶部313は、メモリリーク判定装置1がメモリリークの判定を行う際の閾値や閾値算出基準を記憶する。
図4は、判定条件情報記憶部313が記憶する判定条件情報の例を示す図である。同図の例では、判定条件情報には、メモリ使用量最大値の更新回数の閾値である「更新回数閾値」と、メモリ使用量の閾値の算出基準である「メモリ使用量閾値算出係数」と、メモリリーク判定装置1がメモリリークの有無を判定する時間間隔である「判定時間間隔」とが含まれている。更新回数閾値とメモリ使用量閾値算出係数と判定時間間隔とは、例えば、ユーザの操作を受けた操作入力部11が、判定条件情報記憶部313に書き込む。
【0016】
処理内容情報記憶部314は、メモリリーク有りと判定されたプロセスに対する処理の内容を記憶する。
図5は、処理内容情報記憶部314が記憶する処理内容情報の例を示す図である。同図の例で示すように、処理内容情報には、メモリリーク有りと判定されたプロセスに対して行う処理の「処理項目名」と、当該処理を実行するための「実行コマンド」と、当該処理を行うか否かを示す「選択フラグ」とが含まれている。処理項目名としては、メモリリーク有りと判定されたプロセスを停止させる(KILLする)「対象プロセス停止」や、予め定められたスクリプトを実行する「スクリプト実行」や、メモリリークに関する情報をログに出力する「ログ出力」と、メモリリークが発生したことをユーザ(コンピュータの管理者)に警告する「警告表示」とが示されている。実行コマンド欄には、当該処理を実行するためのコマンドが格納されている。また、選択フラグの「○」は、当該処理を行うことを示し、「×」は当該処理を行わないことを示す。選択フラグの値は、例えば、ユーザの入力操作を受けた操作入力部11が、処理内容情報記憶部314に書き込む。
【0017】
処理結果情報記憶部315は、メモリリーク有りと判定されたプロセスに対する処理結果を記憶する。
図6は、処理結果情報記憶部315が記憶する処理結果情報の例を示す図である。同図の例では、処理結果情報には、メモリリーク判定装置がメモリリーク有りと判定した「判定時刻」と、メモリリーク有りと判定されたプロセスの「プロセスID」および「プロセス名」と、当該プロセスに対する「処理項目名」と、当該処理を行った結果の記録である「処理結果」とが含まれている。
【0018】
メモリ使用量取得部21は、実行中の各プロセスのメモリ使用量を取得して、メモリ使用量情報記憶部312の現在値の欄に書き込む。例えばメモリリーク有無の判定時間間隔が5分に設定されている場合、メモリ使用量取得部21は、プロセス情報記憶部311が記憶する次回時刻に基づいてメモリ使用量を取得し、取得後速やかに、次回時刻に5分加算することにより、実行中の各プロセスについて5分毎にメモリ使用量を取得する。
最大値更新回数計数部22は、メモリ使用量取得部の取得するメモリ使用量が最大値か否かを判定し、最大値と判定した場合は、メモリ使用量情報記憶部312の記憶するメモリ使用量の最大値と最大値更新回数とを書き換える。
【0019】
メモリリーク判定部23は、メモリリークの有無を、プロセスのメモリ使用量の最大値更新回数が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上であるか否かに基づいて、メモリリークの有無を判定する。
対策処理実行部24は、メモリリーク判定部23がメモリリーク有りと判定した場合に、処理内容情報記憶部314が記憶する処理内容情報に基づいて対策処理を行う。
【0020】
操作入力部11は、キーボードやマウス等を具備し、ユーザの入力操作を受け付ける。操作入力部11は、更新回数閾値、または、メモリ使用量閾値算出係数の入力を受け付けると判定条件情報記憶部313の該当欄に書込み、選択フラグの値の入力を受け付けると処理内容情報記憶部314の記憶する選択フラグの該当欄に書き込む。
表示部12は、液晶ディスプレイ等の表示画面を含み、メモリリーク発生時に警告を表示する。具体的には、警告表示の選択フラグが「○」になっている場合、メモリリークが発生すると、対策処理実行部24から表示部12に対して、警告画面の画像データが出力される。表示部12は、対策処理実行部24から出力される画像データに基づいて、メモリリーク発生を示す警告画面を表示する。
【0021】
なお、メモリリーク判定装置1は、メモリリーク判定対象のコンピュータ内に実現されていてもよいし、当該コンピュータとは独立した装置として実現されていてもよい。
メモリリーク判定装置1がメモリリーク判定対象のコンピュータ内に実現される場合、例えば、メモリ使用量取得部21と、最大値更新回数計数部22と、メモリリーク判定部23と対策処理実行部24とは、コンピュータの中央演算装置(Central Processing Unit;CPU)上のプロセスとして実現され、記憶部31の各部は、コンピュータの記憶装置上に記憶領域を確保することにより実現される。
【0022】
メモリリーク判定装置1がメモリリーク判定対象のコンピュータと独立した装置として実現される場合、メモリリーク判定装置1は、メモリリーク判定対象のコンピュータと通信して当該コンピュータ上で実行中の各プロセスのメモリ使用量を取得する。また、メモリリーク有りと判定した場合は、当該コンピュータに対策処理の実行を指示する信号を送信する。メモリリーク判定装置1は、他のコンピュータ上に実現されていてもよいし、専用の演算回路等により専用のハードウェア装置として実現されていてもよい。
【0023】
次に、図7〜図10を参照して、メモリリーク判定部23が行うメモリリーク有無の判定について説明する。
図7は、メモリリーク判定部23が、メモリリーク有りと判定する例を示すグラフであり、メモリ使用量取得部21が取得する、あるプロセスのメモリ使用量の変化を示す。同図の縦軸はメモリサイズを示す。また、同図の横軸は時間軸であり、プロセスが起動してからの時間を示す。点P101〜P110は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。また、THRはメモリ使用量閾値であり、メモリ使用量初回取得時の点P101におけるメモリ使用量VPに、判定条件情報記憶部313が記憶するメモリ使用量閾値算出係数を乗じた値を示す。
【0024】
メモリリーク判定部23は、メモリ使用量情報記憶部312のメモリ使用量情報を参照して、メモリ使用量の現在値がメモリ使用量閾値以上であり、かつ、メモリ使用量最大値更新回数が判定条件情報記憶部313の記憶する更新回数閾値以上である場合にメモリリーク有りと判定する。以下、図7〜図10で説明する例では、更新回数閾値は「8」に設定されている。
図7の例では、点P109および点P110において、メモリ使用量の現在値がメモリ使用量閾値THR以上となっている。また、最大値更新回数計数部22は、メモリ使用量初回取得時の点P101では、最大値更新回数を「0」としてメモリ使用量情報記憶部312の最大値更新回数欄に書き込む。以降、点P102で最大値更新回数を「1」、点P103で「2」というように、最大値が更新される毎に最大値更新回数に1を加算してメモリ使用量情報記憶部312の最大値更新回数欄に書き込む。図7の場合、点P106では最大値が更新されていないので、点P110において、最大値更新回数が更新回数閾値の「8」に達する。
【0025】
あるプロセスにメモリリークが発生している場合、当該プロセスが確保したメモリ領域のうちメモリリークする領域が解放されないので、当該プロセスのメモリ使用量は図7に示すように時間経過に応じて増加していくと考えられる。そこで、メモリリーク判定部23は、メモリ使用量の最大値更新回数が更新回数閾値以上であることを、メモリリーク判定条件の1つとしている。一方、プロセスの正常動作においてメモリ使用量が増加する場合は、当該プロセスの確保したメモリ領域が処理終了後に解放されることにより、当該プロセスのメモリ使用量が一定の範囲内に収まる、すなわち一定値以上とならないことが期待できる。そこで、メモリリーク判定部23は、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減させるために、メモリ使用量の現在値が、メモリ使用量閾値THR以下である場合は、メモリ使用量の最大値更新回数が更新回数閾値以上か否かにかかわらず、メモリリーク無しと判定する。
【0026】
なお、メモリリーク判定部23が、メモリ使用量最大値の更新回数と更新回数閾値との比較のみでメモリリークの有無を判定するようにしてもよい。この場合、メモリ使用量の最大値更新回数が更新回数閾値以上となると、メモリリーク判定部23は、メモリ使用量の現在値にかかわらずメモリリーク有りと判定するので、より早い段階でメモリリークを検出し得る。
一方、上述のように、メモリ使用量最大値の更新回数が更新回数閾値以上であることに加えて、メモリ使用量の現在値がメモリ使用量閾値THR以上であることも判定条件とすることにより、正常動作におけるメモリ使用量の漸増によりメモリリーク有りと誤判定する可能性を低減できる。
【0027】
なお、プロセス起動直後は、プロセスが未だメモリ領域を確保しておらず、メモリ使用量が極端に小さい値を示すことが考えられる。このため、メモリ使用量取得部21が、メモリ使用量の初回取得値としてプロセス起動直後のメモリ使用量を取得し、この値に基づいてメモリ使用量閾値THRを算出すると、メモリ使用量閾値THRの値が極端に小さい値となり、上述した、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定の低減を行えないおそれがある。そこで、メモリ使用量取得部21は、プロセス起動から一定時間経過後の点P101において初回のメモリ使用量取得を行っている。
なお、プロセスが起動時に直ちにメモリ領域を確保するようプログラムされている場合は、メモリ使用量取得部21が、プロセス起動時に初回のメモリ使用量取得を行うようにしてもよい。これにより、メモリ使用量取得部21が、プロセス起動から一定時間経過後に初回のメモリ使用量取得を行う場合よりも更に早い段階でメモリリークを検出し得る。
【0028】
図8は、メモリリーク判定部が、メモリリーク無しと判定する第1の例を示すグラフであり、プロセスのメモリ使用量が一時的にメモリ使用量閾値以上となる例を示している。図7と同様、図8の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P201〜P210は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0029】
グラフ表示されているプロセスのメモリ使用量は、点P202においてメモリ使用量閾値THR以上となっているが、この時点でのメモリ使用量の最大値更新回数は「1」であり、更新回数閾値「8」未満なので、メモリリーク判定部23は、メモリリーク無しと判定する。また、点P203〜P210でのメモリ使用量は、点P202でのメモリ使用量以下なので、メモリ使用量の最大値更新回数は「1」のまままである。このため、メモリ使用量の最大値更新回数が「0」の点P201も含め、点P201および点P203〜P210でも、メモリリーク判定部23は、メモリリーク無しと判定する。なお、点P201および点P203〜210では、メモリ使用量の現在値がメモリ使用量閾値THR未満であることからも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0030】
このように、メモリリーク判定部23は、メモリ使用量の最大値更新回数に基づいてメモリリークの有無を判定するので、メモリ使用量とメモリ使用量閾値との比較のみでメモリリークの判定を行う方法とは異なり、プロセスの正常動作において増減するメモリ使用量が、一時的にメモリ使用量閾値よりも大きくなった場合に、メモリリーク有りと誤判定する可能性を低減できる。
【0031】
図9は、メモリリーク判定部が、メモリリーク無しと判定する第2の例を示すグラフであり、プロセスが定期的に一定のメモリ領域を確保する場合の例を示している。図7〜図8と同様、図9の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P301〜P310は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0032】
グラフ表示されているプロセスのメモリ使用量は、点P302においてメモリ使用量閾値THR以上となっているが、この時点でのメモリ使用量の最大値更新回数は「1」であり、更新回数閾値「8」未満なので、メモリリーク判定部23は、メモリリーク無しと判定する。また、点P306および点P309でのメモリ使用量は、点P303でのメモリ使用量と同じであり、点P304〜P310でメモリ使用量の最大値更新回数は「1」のままである。このため、メモリ使用量の最大値更新回数が「0」の点P301〜P302も含め、点P301〜P302および点P304〜P310でも、メモリリーク判定部23は、メモリリーク無しと判定する。なお、点P301とP302とP304とP305とP307とP308とP310とでは、メモリ使用量の現在値がメモリ使用量閾値THR未満であることからも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0033】
このように、メモリリーク判定部23は、メモリ使用量の最大値更新回数に基づいてメモリリークの有無を判定するので、メモリ使用量とメモリ使用量閾値との比較のみでメモリリークの判定を行う方法とは異なり、プロセスの正常動作において増減するメモリ使用量が、定期的にメモリ使用量閾値よりも大きくなる場合にも、メモリリーク有りと誤判定する可能性を低減できる。
【0034】
図10は、メモリリーク判定部が、メモリリーク無しと判定する第3の例を示すグラフであり、プロセスのメモリ使用量がメモリ使用量閾値未満の範囲で変化する場合の例を示している。図7〜図9と同様、図10の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P401〜P410は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0035】
同図の例では、点P402〜P409でメモリ使用量の最大値が更新され、点409で最大値更新回数が更新回数閾値と同じ「8」となっている。しかし、点P409の現在値は判定閾値THRよりも小さいため、メモリリーク判定部23は、点P409でメモリリーク無しと判定する。また、点P401〜P408およびP410でも、メモリ使用量はメモリ使用量閾値未満であり、メモリリーク判定部23はメモリリーク無しと判定する。なお、点P401〜P408では、メモリ使用量の最大値更新回数は、更新回数閾値「8」未満であり、この点でも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0036】
プロセスの正常動作においてメモリ使用量が増加する場合は、当該プロセスの確保したメモリ領域が処理終了後に解放されることにより、例えば図10の点P410のように、メモリ使用量が減少することが期待できる。これにより、当該プロセスのメモリ使用量が一定の範囲内に収まる、すなわち一定値以上とならないことが期待できる。そこで、前述したように、メモリリーク判定部23は、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減させるために、メモリ使用量の現在値が、メモリ使用量閾値THR以上であることを、メモリリーク判定条件の1つとしている。
【0037】
次に、図11を参照して、メモリリーク判定装置1の動作について説明する。
図11は、メモリリーク判定装置1が、ある1つのプロセスに関して行う、メモリリーク有無の判定処理手順を示す図である。メモリリーク判定装置1は、新たにプロセスが実行されると同図の処理を開始する。以下では、同図でメモリリーク有無の判定対象となるプロセスを「対象プロセス」という。
新たに対象プロセスが実行されると、例えばOS(Operating System)が、対象プロセスのプロセスIDとプロセス名と実行開始時刻とをメモリ使用量取得部21に出力する。メモリ使用量取得部21は、OSから出力されたプロセスIDとプロセス名と実行開始時刻とを対応付けて、プロセス情報記憶部311が記憶するプロセス情報に追加する。また、メモリ使用量取得部21は、OSから出力されたプロセスIDとプロセス名とを対応付けて、メモリ使用量情報記憶部312が記憶するメモリ使用量情報に追加する(以上、ステップS101)。
【0038】
その後、メモリ使用量取得部21は、所定の時間経過を待って(ステップS102)、対象プロセスのメモリ使用量を取得する(ステップS103)。
所定の時間経過を待つのは、上述したように、対象プロセスが未だメモリ領域を確保していない状態における、極端に小さいメモリ使用量に基づいて、メモリ使用量閾値THRを算出することを防止するためである。ステップS102での待ち時間は、判定条件情報記憶部313が記憶する判定時間間隔と同じであってもよいし、判定時間間隔とは別に定められた時間であってもよい。例えば、ユーザが、プロセスの正常動作時における時間毎のメモリ使用量の統計をとり、この統計に基づいてステップS102の待ち時間とメモリ使用量閾値算出係数とを決定して判定条件情報記憶部313に書き込むようにしてもよい。
メモリ使用量取得部21は、例えば、実行中の各プロセスのプロセスIDとプロセス名とメモリ使用量との出力をOSから随時受けており、ステップS102の所定時間経過時にOSから出力されるメモリ使用量を、メモリ使用量取得値とする。
【0039】
メモリ使用量取得部21は、取得したメモリ使用量を、メモリ使用量情報記憶部312の記憶するメモリ使用量情報の、対象プロセスの行の初期値欄と最大値欄と現在値欄とに書き込む。また、メモリ使用量取得部21は、判定条件情報記憶部313からメモリ使用量閾値算出係数を読み出し、読み出したメモリ使用量閾値算出係数を、先に取得したメモリ使用量に乗じることにより、メモリ使用量閾値を算出する。メモリ使用量取得部21は、算出したメモリ使用量閾値を、メモリ使用量情報の対象プロセスの行のメモリ使用量閾値欄に書き込む。さらに、メモリ使用量取得部21は、メモリ使用量情報の対象プロセスの行の最大値更新回数欄に「0」を書き込む。加えて、メモリ使用量取得部21は、判定条件情報記憶部313から判定時間間隔を読み出し、読み出した判定時間間隔を、ステップS103においてメモリ使用量を取得した時刻に加えることにより、対象プロセスのメモリリーク有無の判定を次に行う時刻を算出する。メモリ使用量取得部21は、算出した時刻を、プロセス情報の当該プロセスの行の次回時刻欄に書き込む(以上、ステップS104)。
【0040】
そして、メモリ使用量取得部21は、次回時刻に書き込んだ時刻となるまで時間経過待ちを行う(ステップS105)。その後、メモリ使用量取得部21は、対象プロセスが実行中か否かを判定する。例えば、メモリ使用量取得部21は、OSから随時出力される実行中のプロセスの情報に、対象プロセスのプロセスIDとプロセス名とが含まれている場合は、対象プロセスが実行中であると判定する。一方、対象プロセスのプロセスIDとプロセス名とが含まれていない場合は、メモリ使用量取得部21は、対象プロセスが実行中ではないと判定する(以上、ステップS106)。対象プロセスが実行中でないと判定した場合(ステップS106:NO)、メモリ使用量取得部21は、プロセス情報とメモリ使用量情報とから、対象プロセスの行を削除する(ステップS121)。その後、図11の処理を終了する。
【0041】
一方、ステップS106で、対象プロセスが実行中であると判定した場合(ステップS106:YES)、メモリ使用量取得部21は、対象プロセスのメモリ使用量を取得し(ステップS107)、メモリ使用量情報記憶部312が記憶する対象プロセスのメモリ使用量の現在値を、取得したメモリ使用量に更新する。
また、メモリ使用量取得部21は、プロセス情報記憶部311が記憶するプロセス情報から次回時刻を読み出す。上述したように、次回時刻は、メモリリーク判定装置1(のメモリリーク判定部23)が、次に対象プロセスのメモリリークを判定する時刻を示す情報である。また、メモリ使用量取得部21は、判定条件情報記憶部313が記憶する判定条件情報から、判定時間間隔を読み出す。メモリ使用量取得部21は、読み出した次回時刻に判定時間間隔を加えることにより新たな次回時刻を算出し、プロセス情報記憶部311の記憶する対象プロセスの次回時刻を、算出した次回時刻に更新する。
【0042】
その後、メモリ使用量取得部21は、メモリ使用量の現在値を更新したことを示す信号を最大値更新回数計数部22に出力する。例えば、メモリ使用量取得部21は、メモリ使用量現在値を更新したことを示す信号に対象プロセスのプロセスIDを含めて出力する。これにより、最大値更新回数計数部22は、対象プロセスがどのプロセスかを把握できる(以上、ステップS108)。
【0043】
最大値更新回数計数部22は、メモリ使用量の現在値を更新したことを示す信号の出力を受けると、対象プロセスのメモリ使用量の現在値と最大値とをメモリ使用量情報記憶部312から読み出す。そして、最大値更新回数計数部22は、最大値が更新されたか否か、すなわち、読み出した現在値が最大値よりも大きいか否かを判定する(以上、ステップS109)。最大値が更新されたと判定した場合(ステップS109:YES)、最大値更新回数計数部22は、メモリ使用量情報記憶部312の記憶する、対象プロセスのメモリ使用量の最大値欄に、対象プロセスのメモリ使用量の現在値を書き込む。また、最大値更新回数計数部22は、メモリ使用量情報記憶部312の記憶する、対象プロセスのメモリ使用量の最大値更新回数を、当該最大値更新回数に1を加えた値に更新する。
その後、最大値更新回数計数部22は、メモリ使用量取得部21から出力された、メモリ使用量の現在値を更新したことを示す信号を、メモリリーク判定部23に出力(転送)する(以上、ステップS110)。
【0044】
メモリリーク判定部23は、メモリ使用量の現在値を更新したことを示す信号の出力を受けると、対象プロセスに関するメモリリークの有無を判定する。上述したように、メモリリーク判定部23は、メモリ使用量情報記憶部312から、対象プロセスのメモリ使用量の現在値Mと、最大値更新回数Uと、メモリ使用量閾値TMとを読み出し、判定条件情報記憶部313から、更新回数閾値TUを読み出す。そして、メモリリーク判定部23は、式(1)が成立する場合は、対象プロセスに関してメモリリーク有りと判定し、成立しない場合は、対象プロセスに関してメモリリーク無しと判定する(以上ステップS111)。
M≧TM、かつ、U≧TU ・・・ 式(1)
【0045】
メモリリーク有りと判定した場合(ステップS111:YES)、メモリリーク判定部23は、対策処理の実行を指示する信号に対象プロセスのプロセスIDを含めて対策処理実行部24に出力する。
対策処理実行部24は、対策処理の実行を指示する信号の出力を受けると、メモリリークに対する対策処理を実行する。具体的には、対策処理実行部24は、対策処理の実行を指示する信号から対象プロセスのプロセスIDを読み出し、また、処理内容情報記憶部314から、選択フラグが「○」になっている処理の実行コマンドを読み出す。そして、対策処理実行部24は、読み出したプロセスIDが示す対象プロセスに関して、読み出した実行コマンドを実行する(以上ステップS112)。その後、ステップS105に戻る。
【0046】
一方、ステップS109において、最大値が更新されていないと判定した場合(ステップS109:NO)はステップS111に進む。すなわち、最大値および最大値更新回数を更新せずに、メモリリーク有無の判定に進む。
また、ステップS111でメモリリーク無しと判定した場合(ステップS111:NO)はステップS105に戻る。すなわち、メモリリークに対する対策処理を行わずに、次回時刻到達を待ち受ける。
【0047】
以上のように、メモリリーク判定装置1のメモリリーク判定部23は、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かに基づいてメモリリークの有無を判定する。したがって、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置と比較すると、メモリリーク判定装置1は、メモリ使用量が当該閾値未満の、より早い段階でメモリリークを検出できる。この点で、メモリリーク判定装置1は、メモリリークの発生を早期に検知できる。
また、実際にはメモリリークが発生しておらず、対象プロセスのメモリ使用量が一時的に増加したに過ぎない場合、メモリリーク判定装置1は、対象プロセスのメモリ使用量の最大値更新回数に基づいて、メモリリーク無しと判定し得る。
【0048】
また、比較的大きなメモリ領域を確保するプロセスが一定時間以上実行状態にある場合など、メモリ使用量増加率が大きな値となる場合でも、メモリリークが発生していない場合は、メモリ使用量が一定の範囲内に収まり、メモリ使用量の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、メモリリーク判定装置1は、メモリリーク無しと判定できる。この点で、メモリリーク判定装置1は、メモリ使用量増加率の大小にかかわらず、メモリリークの有無について誤判定を行うおそれが少ない。
さらに、メモリリークが発生している場合は、メモリ使用量の増加率の大小にかかわらず、メモリ使用量が増加し続けることが考えられる。メモリ使用量の増加率が小さい場合でも、メモリリーク検出装置1は、メモリ使用量の最大値更新回数が更新回数閾値以上、かつ、メモリ使用量がメモリ使用量閾値以上となった時点で、メモリ使用量が増加し続けていることを検出し、メモリリーク有りと判定できる。この点でも、メモリリーク判定装置1は、メモリ使用量増加率の大小にかかわらず、メモリリークの有無について誤判定を行うおそれが少ない。
【0049】
また、メモリリーク判定部23は、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのメモリ使用量の現在値がメモリ使用量閾値以上か否かに基づいてメモリリークの有無を判定する。これにより、メモリリークが発生しておらず、対象プロセスのメモリ使用量が一定の範囲内に収まる場合に、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減できる。
また、メモリリーク判定装置1は、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置と比較すると、メモリ使用量閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのメモリ使用量が一時的にあるいは定期的にメモリ使用量閾値以上となる場合でも、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かの判定により、メモリリークが発生していないにもかかわらずメモリリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置よりも、対象プロセスのメモリ使用量が小さい段階で、すなわち、より早期にメモリリークを検出できる。
【0050】
また、メモリリーク判定装置1では、メモリ使用量取得部21は、メモリ使用量の初期値にメモリ使用量閾値算出係数を乗じた値、すなわち、メモリ使用量の初期値を所定定数倍した値をメモリ使用量閾値とし、メモリリーク判定部23は、このメモリ使用量閾値を用いてメモリリークの有無を判定する。このように、メモリリーク判定部23は、判定対象のプロセスの規模に応じて設定されたメモリ使用量閾値を用いてメモリリーク有無を判定するので、より正確にメモリリーク有無を判定できることが期待できる。
【0051】
なお、メモリリーク判定部23が、複数のプロセスについて纏めてメモリリークの有無を判定するようにしてもよい。例えば、メモリ使用量取得部21は、実行中の全プロセスについてメモリ使用量を取得し、実行中の全プロセスのメモリ使用量を実行中のプロセス数で除したメモリ使用量平均値を算出する。メモリリーク判定部23は、メモリ使用量取得部21が算出したメモリ使用量平均値について、当該メモリ使用量平均値の最大値更新回数が更新回数閾値以上、かつ、当該メモリ使用量平均値がメモリ使用量平均値閾値以上のときに、メモリリーク有りと判定する。
このように、複数のプロセスについて纏めてメモリリークの有無を判定することにより、メモリ使用量情報等をプロセス毎に記憶する必要が無いので、メモリリーク判定に用いるメモリ容量を低減できる。
【0052】
なお、メモリリーク判定部23がメモリリークの有無の判定に用いるメモリ使用量閾値は、上述したメモリ使用量の初期値に基づくものに限らない。例えば、プロセスの種類に応じて、メモリ使用量閾値が予め定められていてもよい。これにより、メモリ使用量取得部がメモリ使用量閾値を算出する負荷を削減できる。
【0053】
<第1の変形例>
以上ではメモリリークの有無の判定を行う場合について説明したが、本発明は、プロセスがオープンしたファイルのクローズ漏れ(以下では、「ファイルリーク」という)の有無の判定にも適用できる。
ファイルリークが発生すると、クローズ漏れしたファイルのメモリ領域が解放されないことによりメモリリークが生じる。また、クローズ漏れしたファイルの解放を待っているプロセスが存在する場合、当該プロセスが当該ファイルを取得でないことにより、当該プロセス、ひいてはコンピュータの処理速度低下や動作不安定化が生じるおそれがある。
【0054】
図12は、本発明の第1の変形例におけるファイルリーク判定装置の概略構成を示す構成図である。同図において、ファイルリーク判定装置(コンピュータ資源解放漏れ判定装置)4は、操作入力部11と、表示部12と、オープンファイル数取得部(コンピュータ資源使用量取得部)51と、最大値更新回数計数部52と、ファイルリーク判定部(解放漏れ判定部)53と、対策処理実行部24と、記憶部61とを具備する。記憶部61は、プロセス情報記憶部311と、オープンファイル数情報記憶部612と、判定条件情報記憶部613と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
同図において、図1の各部と同様の機能を有する部分には、同一の符号(11、12、24、311、314、315)を付し、説明を省略する。
【0055】
オープンファイル数情報記憶部612は、実行中の各プロセスのメモリ使用量の初期値と最大値と現在値とに換えて、実行中の各プロセスのオープンファイル数の初期値と最大値と現在値とを記憶する点、および、メモリ使用量閾値に代えて、オープンファイル数閾値(オープンファイル数の現在値に対する判定閾値)を記憶する点で、図1のメモリ使用量情報記憶部312と異なる。
判定条件情報記憶部613は、メモリ使用量閾値算出係数に換えて、オープンファイル数閾値算出係数を記憶する点で、図1の判定条件情報記憶部313と異なる。オープンファイル数閾値算出係数は、オープンファイル数情報記憶部612が記憶するオープンファイル数初期値に乗じることにより、同じくオープンファイル数情報記憶部612が記憶するオープンファイル数閾値を算出するための係数である。
【0056】
オープンファイル数取得部51は、実行中の各プロセスのオープンファイル数をOSから取得し、各プロセスのオープンファイル数の初期値や現在値やオープンファイル数閾値を含むオープンファイル数情報を、オープンファイル数情報記憶部612に書き込む点で、実行中の各プロセスのメモリ使用量をOSから取得し、各プロセスのメモリ使用量の初期値や現在値やメモリ使用量閾値を含むメモリ使用量情報を、メモリ使用量情報記憶部312に書き込む図1のメモリ使用量取得部21と異なる。
最大値更新回数計数部52は、オープンファイル数の最大値が更新されたか否かを判定し、更新されたと判定した場合は、オープンファイル数情報記憶部612が記憶するオープンファイル数の最大値と最大値更新回数とを更新する点で、メモリ使用量の最大値が更新されたか否かを判定し、更新されたと判定した場合には、メモリ使用量情報記憶部312が記憶するメモリ使用量の最大値と最大値更新回数とを更新する図1の最大値更新回数計数部22と異なる。
ファイルリーク判定部53は、オープンファイル数情報記憶部612からオープンファイル数の現在値と最大値更新回数とオープンファイル数閾値とを読み出し、判定条件情報記憶部613から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、オープンファイル数の現在値がオープンファイル数閾値以上である場合にファイルリーク有りと判定する点で、メモリ使用量情報記憶部312からメモリ使用量の現在値と最大値更新回数とメモリ使用量閾値とを読み出し、判定条件情報記憶部313から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上である場合にメモリリーク有りと判定する図1のメモリリーク判定部23と異なる。
【0057】
ファイルリーク判定装置4は、オープンファイル数の最大値更新回数に基づいてファイルリークの有無を判定するので、オープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置と比較すると、オープンファイル数が当該閾値未満の、より早い段階でファイルリークを検出できる。
また、実際にはファイルリークが発生しておらず、ファイルリーク判定対象のプロセス(以下、「対象プロセス」という)のオープンファイル数が一時的に増加したに過ぎない場合、ファイルリーク判定装置4は、対象プロセスのオープンファイル数の最大値更新回数に基づいて、ファイルリーク無しと判定し得る。
【0058】
また、多数のファイルを使用するプロセスが一定時間以上実行状態にある場合など、オープンファイル数増加率が大きな値となる場合でも、ファイルリークが発生していない場合は、オープンファイル数が一定の範囲内に収まり、オープンファイル数の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、ファイルリーク判定装置4は、ファイルリーク無しと判定できる。この点で、ファイルリーク判定装置1は、オープンファイル数増加率の大小にかかわらず、ファイルリークの有無について誤判定を行うおそれが少ない。
さらに、ファイルリークが発生している場合は、オープンファイル数の増加率の大小にかかわらず、オープンファイル数が増加し続けることが考えられる。オープンファイル数の増加率が小さい場合でも、ファイルリーク検出装置4は、オープンファイル数の最大値更新回数が更新回数閾値以上、かつ、オープンファイル数がオープンファイル数閾値以上となった時点で、オープンファイル数が増加し続けていることを検出し、ファイルリーク有りと判定できる。この点でも、ファイルリーク判定装置4は、オープンファイル数増加率の大小にかかわらず、ファイルリークの有無について誤判定を行うおそれが少ない。
【0059】
また、ファイルリーク判定部53は、対象プロセスのオープンファイル数の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのオープンファイル数の現在値がオープンファイル数閾値以上か否かに基づいてファイルリークの有無を判定する。これにより、ファイルリークが発生しておらず、対象プロセスのオープンフィル数が一定の範囲内に収まる場合に、プロセスの正常動作におけるオープンファイル数の漸増によりファイルリーク有りとする誤判定を低減できる。
また、ファイルリーク判定装置4は、プロセスのオープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置と比較すると、オープンファイル数閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのオープンファイル数が一時的にあるいは定期的にオープンファイル数閾値以上となる場合でも、対象プロセスのオープンファイル数の最大値更新回数が最大値更新回数閾値以上か否かの判定により、ファイルリークが発生していないにもかかわらずファイルリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのオープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置よりも、対象プロセスのオープンファイル数が小さい段階で、すなわち、より早期にファイルリークを検出できる。
【0060】
また、ファイルリーク判定装置4では、オープンファイル数取得部51は、オープンファイル数の初期値にオープンファイル数閾値算出係数を乗じた値、すなわち、オープンファイル数の初期値を所定定数倍した値をオープンファイル数閾値とし、ファイルリーク判定部53は、このオープンファイル数閾値を用いてファイルリークの有無を判定する。このように、ファイルリーク判定部53は、判定対象のプロセスの規模に応じて設定されたオープンファイル数閾値用いてファイルリーク有無を判定するので、より正確にファイルリーク有無を判定できることが期待できる。
【0061】
<第2の変形例>
また、本発明は、マルチスレッド処理を行うプロセスのスレッド終了漏れ(以下では、「スレッドリーク」という)の有無の判定にも適用できる。
スレッドリークが発生すると、終了漏れしたスレッドが使用する資源の解放漏れが生じ、この解放漏れした資源を他のプロセスや他のスレッドが使用でないことにより、当該プロセス、ひいてはコンピュータの処理速度低下や動作不安定化が生じるおそれがある。
【0062】
図13は、本発明の第2の変形例におけるスレッドリーク判定装置の概略構成を示す構成図である。同図において、スレッドリーク判定装置(コンピュータ資源解放漏れ判定装置)7は、操作入力部11と、表示部12と、スレッド数取得部(コンピュータ資源使用量取得部)81と、最大値更新回数計数部82と、スレッドリーク判定部(解放漏れ判定部)83と、対策処理実行部24と、記憶部91とを具備する。記憶部91は、プロセス情報記憶部311と、スレッド数情報記憶部912と、判定条件情報記憶部913と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
同図において、図1の各部と同様の機能を有する部分には、同一の符号(11、12、24、311、314、315)を付し、説明を省略する。
【0063】
スレッド数情報記憶部912は、実行中の各プロセスのメモリ使用量の初期値と最大値と現在値とに換えて、実行中の各プロセスのスレッド数の初期値と最大値と現在値とを記憶する点、および、メモリ使用量閾値に代えて、スレッド数閾値(スレッド数の現在値に対する判定閾値)を記憶する点で、図1のメモリ使用量情報記憶部312と異なる。
判定条件情報記憶部913は、メモリ使用量閾値算出係数に換えて、スレッド数閾値算出係数を記憶する点で、図1の判定条件情報記憶部313と異なる。スレッド数閾値算出係数は、スレッド数情報記憶部912が記憶するスレッド数初期値に乗じることにより、同じくスレッド数情報記憶部912が記憶するスレッド数閾値を算出するための係数である。
【0064】
スレッド数取得部81は、実行中の各プロセスのスレッド数をOSから取得し、各プロセスのスレッド数の初期値や現在値やスレッド数閾値を含むスレッド数情報を、スレッド数情報記憶部912に書き込む点で、実行中の各プロセスのメモリ使用量をOSから取得し、各プロセスのメモリ使用量の初期値や現在値やメモリ使用量閾値を含むメモリ使用量情報を、メモリ使用量情報記憶部312に書き込む図1のメモリ使用量取得部21と異なる。
最大値更新回数計数部82は、スレッド数の最大値が更新されたか否かを判定し、更新されたと判定した場合は、スレッド数情報記憶部912が記憶するスレッド数の最大値と最大値更新回数とを更新する点で、メモリ使用量の最大値が更新されたか否かを判定し、更新されたと判定した場合には、メモリ使用量情報記憶部312が記憶するメモリ使用量の最大値と最大値更新回数とを更新する図1の最大値更新回数計数部22と異なる。
スレッドリーク判定部83は、スレッド数情報記憶部912からスレッド数の現在値と最大値更新回数とスレッド数閾値とを読み出し、判定条件情報記憶部913から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、スレッド数の現在値がスレッド数閾値以上である場合にスレッドリーク有りと判定する点で、メモリ使用量情報記憶部312からメモリ使用量の現在値と最大値更新回数とメモリ使用量閾値とを読み出し、判定条件情報記憶部313から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上である場合にメモリリーク有りと判定する図1のメモリリーク判定部23と異なる。
【0065】
スレッドリーク判定装置7は、スレッド数の最大値更新回数に基づいてスレッドリークの有無を判定するので、スレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置と比較すると、スレッド数が当該閾値未満の、より早い段階でスレッドリークを検出できる。
また、実際にはスレッドリークが発生しておらず、スレッドリーク判定対象のプロセス(以下、「対象プロセス」という)のスレッド数が一時的に増加したに過ぎない場合、スレッドリーク判定装置7は、対象プロセスのスレッド数の最大値更新回数に基づいて、スレッドリーク無しと判定し得る。
【0066】
また、多数のスレッドを使用するプロセスが一定時間以上実行状態にある場合など、スレッド数増加率が大きな値となる場合でも、スレッドリークが発生していない場合は、スレッド数が一定の範囲内に収まり、スレッド数の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、スレッドリーク判定装置4は、スレッドリーク無しと判定できる。この点で、スレッドリーク判定装置7は、スレッド数増加率の大小にかかわらず、スレッドリークの有無について誤判定を行うおそれが少ない。
さらに、スレッドリークが発生している場合は、スレッド数の増加率の大小にかかわらず、スレッド数が増加し続けることが考えられる。スレッド数の増加率が小さい場合でも、スレッドリーク検出装置7は、スレッド数の最大値更新回数が更新回数閾値以上、かつ、スレッド数がスレッド数閾値以上となった時点で、スレッド数が増加し続けていることを検出し、スレッドリーク有りと判定できる。この点でも、スレッドリーク判定装置7は、スレッド数増加率の大小にかかわらず、スレッドリークの有無について誤判定を行うおそれが少ない。
【0067】
また、スレッドリーク判定部83は、対象プロセスのスレッド数の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのスレッド数の現在値がスレッド数閾値以上か否かに基づいてスレッドリークの有無を判定する。これにより、スレッドリークが発生しておらず、対象プロセスのオープンフィル数が一定の範囲内に収まる場合に、プロセスの正常動作におけるスレッド数の漸増によりスレッドリーク有りとする誤判定を低減できる。
また、スレッドリーク判定装置7は、プロセスのスレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置と比較すると、スレッド数閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのスレッド数が一時的にあるいは定期的にスレッド数閾値以上となる場合でも、対象プロセスのスレッド数の最大値更新回数が最大値更新回数閾値以上か否かの判定により、スレッドリークが発生していないにもかかわらずスレッドリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのスレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置、対象プロセスのスレッド数が小さい段階で、すなわち、より早期にスレッドリークを検出できる。
【0068】
また、スレッドリーク判定装置7では、スレッド数取得部81は、スレッド数の初期値にスレッド数閾値算出係数を乗じた値、すなわち、スレッド数の初期値を所定定数倍した値をスレッド数閾値とし、スレッドリーク判定部83は、このスレッド数閾値を用いてスレッドリークの有無を判定する。このように、スレッドリーク判定部83は、判定対象のプロセスの規模に応じて設定されたスレッド数閾値を用いてスレッドリークの有無を判定するので、より正確にスレッドリーク有無を判定できることが期待できる。
【0069】
なお、上述したように、メモリリーク判定装置1を、コンピュータ内に実現してもよい。同様に、ファイルリーク判定装置4やスレッドリーク判定装置7も、コンピュータ内に実現してもよい。具体的には、メモリリーク判定装置1や、ファイルリーク判定装置4や、スレッドリーク判定装置7の全部または一部の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより各部の処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、OSや周辺機器等のハードウェアを含むものとする。
また、「コンピュータシステム」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであってもよい。
【0070】
以上、本発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計変更等も含まれる。
【産業上の利用可能性】
【0071】
本発明は、資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムに用いて好適である。
【符号の説明】
【0072】
1 メモリリーク判定装置
11 操作入力部
12 表示部
21 メモリ使用量取得部
22、52、82 最大値更新回数計数部
23 メモリリーク判定部
24 対策処理実行部
31、61、91 記憶部
311 プロセス情報記憶部
312 メモリ使用量情報記憶部
313、613、913 判定条件情報記憶部
314 処理内容情報記憶部
315 処理結果情報記憶部
4 ファイルリーク判定装置
51 オープンファイル数取得部
53 ファイルリーク判定部
612 オープンファイル数情報記憶部
7 スレッドリーク判定装置
81 スレッド数取得部
83 スレッドリーク判定部
912 スレッド数情報記憶部
【技術分野】
【0001】
本発明は、資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムに関する。
【背景技術】
【0002】
プログラムのバグやウィルスの混入など何らかの原因で、オペレーティングシステム(Operating System;OS)やアプリケーションソフトのプロセスが、動的に確保したメモリ領域を開放しない現象は、メモリリークと呼ばれている。メモリリークが生じると、使用可能なメモリ領域が減少してコンピュータの処理能力が低下する、あるいは、コンピュータの動作が不安定になるおそれがある。
メモリリークの有無を判定する方法として、プロセス毎のメモリ使用量を検出し、いずれかのプロセスのメモリ使用量が所定の閾値を超えた場合に、メモリリーク有りと判定する方法がある。しかし、この方法では、メモリ使用量が当該閾値を超えるまでメモリリーク有りとの判定が行われず、メモリリークの検知が遅れてしまう。また、実際にはメモリリークが発生しておらず、メモリ使用量が一時的に閾値を超えたに過ぎない場合も、メモリリーク有りとの誤検出を行ってしまう。
そこで、特許文献1では、プロセス毎に、直近24時間のメモリ使用量平均値と過去のメモリ使用量平均値とを比較してメモリ使用量増加率を算出し、いずれかのプロセスのメモリ使用量増加率が予め定められた閾値を超える場合に、メモリリーク有りと判定する方法が示されている。この方法によれば、メモリ使用量増加率に基づいてメモリリークの有無を判定するので、メモリ使用量が比較的小さい早期段階でメモリリークを検知し得る。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2005-250751号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、特許文献1の方法では、比較的大きなメモリ領域を確保するプロセスが一定時間以上(例えば、直近24時間近く)実行状態にある場合にも、メモリ使用量増加率が閾値を超えることが考えられる。この場合、実際にはメモリリークが発生していないにもかかわらず、メモリリーク有りとの誤判定を行ってしまうおそれがある。また、この方法では、メモリ使用量増加率が閾値以下のメモリリークを検出することはできない。
【0005】
また、かかる課題は、メモリ資源に限らず様々なコンピュータ資源について生じうる。例えば、プロセスがオープンしたファイルのクローズ漏れの有無を、プロセスがオープンしたファイル数と閾値との比較により判定する場合や、マルチスレッド処理を行うプロセスのスレッド終了漏れを、スレッド数と閾値との比較により判定する場合も、上記の場合と同様に、オープンファイル数やスレッド数の一時的な増加により誤判定を行ってしまうおそれがある。
【0006】
本発明は、このような事情を考慮してなされたものであり、その目的は、コンピュータ資源の解放漏れを早期に検知し、かつ、コンピュータ資源使用量増加率の大小にかかわらず、コンピュータ資源解放漏れ有無の誤判定を行うおそれの少ない資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムを提供することにある。
【課題を解決するための手段】
【0007】
この発明は上述した課題を解決するためになされたもので、本発明の一態様による資源解放漏れ判定装置は、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置であって、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得部と、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数部と、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定部と、を具備することを特徴とする。
【0008】
また、本発明の一態様による資源解放漏れ判定方法は、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置の資源漏れ判定方法であって、コンピュータ資源使用量取得部が、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、最大値更新回数計数部が、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、解放漏れ判定部が、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、を具備することを特徴とする。
【0009】
また、本発明の一態様によるプログラムは、プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置としてのコンピュータに、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、を実行させるためのプログラムである。
【発明の効果】
【0010】
本発明によれば、コンピュータ資源の解放漏れを早期に検知し、かつ、コンピュータ資源使用量増加率の大小にかかわらず、コンピュータ資源解放漏れ有無の誤判定を行うおそれを少なくできる。
【図面の簡単な説明】
【0011】
【図1】本発明の一実施形態におけるメモリリーク判定装置の概略構成を示す構成図である。
【図2】同実施形態において、プロセス情報記憶部311が記憶するプロセス情報の例を示す図である。
【図3】同実施形態において、メモリ使用量情報記憶部312が記憶するメモリ使用量情報の例を示す図である。
【図4】同実施形態において、判定条件情報記憶部313が記憶する判定条件情報の例を示す図である。
【図5】同実施形態において、処理内容情報記憶部314が記憶する処理内容情報の例を示す図である。
【図6】同実施形態において、処理結果情報記憶部315が記憶する処理結果情報の例を示す図である。
【図7】同実施形態において、メモリリーク判定部23が、メモリリーク有りと判定する例を示すグラフである。
【図8】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第1の例を示すグラフである。
【図9】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第2の例を示すグラフである。
【図10】同実施形態において、メモリリーク判定部が、メモリリーク無しと判定する第3の例を示すグラフである。
【図11】同実施形態において、メモリリーク判定装置1が、ある1つのプロセスに関して行う、メモリリーク有無の判定処理手順を示す図である。
【図12】本発明の第1の変形例におけるファイルリーク判定装置の概略構成を示す構成図である。
【図13】本発明の第2の変形例におけるスレッドリーク判定装置の概略構成を示す構成図である。
【発明を実施するための形態】
【0012】
以下、図面を参照して、本発明の実施の形態について説明する。
図1は、本発明の一実施形態におけるメモリリーク判定装置の概略構成を示す構成図である。同図において、メモリリーク判定装置(資源解放漏れ判定装置)1は、操作入力部11と、表示部12と、メモリ使用量取得部(コンピュータ資源使用量取得部)21と、最大値更新回数計数部22と、メモリリーク判定部(解放漏れ判定部)23と、対策処理実行部24と、記憶部31とを具備する。記憶部31は、プロセス情報記憶部311と、メモリ使用量情報記憶部312と、判定条件情報記憶部313と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
【0013】
メモリリーク判定装置1は、コンピュータ上のプロセスのメモリ使用量に基づいて、メモリリークの有無を判定する。
記憶部31は、メモリリーク判定対象のコンピュータ(以下では、単に「コンピュータ」という)の記憶領域上に実現されて、各種情報を記憶する。プロセス情報記憶部311は、メモリリーク判定装置1が各プロセスのメモリ使用量を取得するために用いる情報であるプロセス情報をプロセス毎に記憶する。
図2は、プロセス情報記憶部311が記憶するプロセス情報の例を示す図である。同図の例では、プロセス情報には、プロセスの識別番号である「プロセスID」と、当該プロセスの「プロセス名」と、当該プロセスの「実行開始時刻」と、メモリリーク判定装置1が次に当該プロセスのメモリ使用量を取得する時刻である「次回時刻」とが含まれている。
【0014】
メモリ使用量情報記憶部312は、実行中のプロセスのメモリ使用量に関する情報であるメモリ使用量情報をプロセス毎に記憶する。
図3は、メモリ使用量情報記憶部312が記憶するメモリ使用量情報の例を示す図である。同図の例では、メモリ使用量情報には、上述した「プロセスID」および「プロセス名」と、当該プロセスのメモリ使用量の「初期値」および「最大値」および「現在値」と、当該最大値が更新された回数を示す「最大値更新回数」と、メモリリーク判定装置1がメモリリークの判定を行う際に用いる閾値である「メモリ使用量閾値」とが含まれている。
【0015】
判定条件情報記憶部313は、メモリリーク判定装置1がメモリリークの判定を行う際の閾値や閾値算出基準を記憶する。
図4は、判定条件情報記憶部313が記憶する判定条件情報の例を示す図である。同図の例では、判定条件情報には、メモリ使用量最大値の更新回数の閾値である「更新回数閾値」と、メモリ使用量の閾値の算出基準である「メモリ使用量閾値算出係数」と、メモリリーク判定装置1がメモリリークの有無を判定する時間間隔である「判定時間間隔」とが含まれている。更新回数閾値とメモリ使用量閾値算出係数と判定時間間隔とは、例えば、ユーザの操作を受けた操作入力部11が、判定条件情報記憶部313に書き込む。
【0016】
処理内容情報記憶部314は、メモリリーク有りと判定されたプロセスに対する処理の内容を記憶する。
図5は、処理内容情報記憶部314が記憶する処理内容情報の例を示す図である。同図の例で示すように、処理内容情報には、メモリリーク有りと判定されたプロセスに対して行う処理の「処理項目名」と、当該処理を実行するための「実行コマンド」と、当該処理を行うか否かを示す「選択フラグ」とが含まれている。処理項目名としては、メモリリーク有りと判定されたプロセスを停止させる(KILLする)「対象プロセス停止」や、予め定められたスクリプトを実行する「スクリプト実行」や、メモリリークに関する情報をログに出力する「ログ出力」と、メモリリークが発生したことをユーザ(コンピュータの管理者)に警告する「警告表示」とが示されている。実行コマンド欄には、当該処理を実行するためのコマンドが格納されている。また、選択フラグの「○」は、当該処理を行うことを示し、「×」は当該処理を行わないことを示す。選択フラグの値は、例えば、ユーザの入力操作を受けた操作入力部11が、処理内容情報記憶部314に書き込む。
【0017】
処理結果情報記憶部315は、メモリリーク有りと判定されたプロセスに対する処理結果を記憶する。
図6は、処理結果情報記憶部315が記憶する処理結果情報の例を示す図である。同図の例では、処理結果情報には、メモリリーク判定装置がメモリリーク有りと判定した「判定時刻」と、メモリリーク有りと判定されたプロセスの「プロセスID」および「プロセス名」と、当該プロセスに対する「処理項目名」と、当該処理を行った結果の記録である「処理結果」とが含まれている。
【0018】
メモリ使用量取得部21は、実行中の各プロセスのメモリ使用量を取得して、メモリ使用量情報記憶部312の現在値の欄に書き込む。例えばメモリリーク有無の判定時間間隔が5分に設定されている場合、メモリ使用量取得部21は、プロセス情報記憶部311が記憶する次回時刻に基づいてメモリ使用量を取得し、取得後速やかに、次回時刻に5分加算することにより、実行中の各プロセスについて5分毎にメモリ使用量を取得する。
最大値更新回数計数部22は、メモリ使用量取得部の取得するメモリ使用量が最大値か否かを判定し、最大値と判定した場合は、メモリ使用量情報記憶部312の記憶するメモリ使用量の最大値と最大値更新回数とを書き換える。
【0019】
メモリリーク判定部23は、メモリリークの有無を、プロセスのメモリ使用量の最大値更新回数が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上であるか否かに基づいて、メモリリークの有無を判定する。
対策処理実行部24は、メモリリーク判定部23がメモリリーク有りと判定した場合に、処理内容情報記憶部314が記憶する処理内容情報に基づいて対策処理を行う。
【0020】
操作入力部11は、キーボードやマウス等を具備し、ユーザの入力操作を受け付ける。操作入力部11は、更新回数閾値、または、メモリ使用量閾値算出係数の入力を受け付けると判定条件情報記憶部313の該当欄に書込み、選択フラグの値の入力を受け付けると処理内容情報記憶部314の記憶する選択フラグの該当欄に書き込む。
表示部12は、液晶ディスプレイ等の表示画面を含み、メモリリーク発生時に警告を表示する。具体的には、警告表示の選択フラグが「○」になっている場合、メモリリークが発生すると、対策処理実行部24から表示部12に対して、警告画面の画像データが出力される。表示部12は、対策処理実行部24から出力される画像データに基づいて、メモリリーク発生を示す警告画面を表示する。
【0021】
なお、メモリリーク判定装置1は、メモリリーク判定対象のコンピュータ内に実現されていてもよいし、当該コンピュータとは独立した装置として実現されていてもよい。
メモリリーク判定装置1がメモリリーク判定対象のコンピュータ内に実現される場合、例えば、メモリ使用量取得部21と、最大値更新回数計数部22と、メモリリーク判定部23と対策処理実行部24とは、コンピュータの中央演算装置(Central Processing Unit;CPU)上のプロセスとして実現され、記憶部31の各部は、コンピュータの記憶装置上に記憶領域を確保することにより実現される。
【0022】
メモリリーク判定装置1がメモリリーク判定対象のコンピュータと独立した装置として実現される場合、メモリリーク判定装置1は、メモリリーク判定対象のコンピュータと通信して当該コンピュータ上で実行中の各プロセスのメモリ使用量を取得する。また、メモリリーク有りと判定した場合は、当該コンピュータに対策処理の実行を指示する信号を送信する。メモリリーク判定装置1は、他のコンピュータ上に実現されていてもよいし、専用の演算回路等により専用のハードウェア装置として実現されていてもよい。
【0023】
次に、図7〜図10を参照して、メモリリーク判定部23が行うメモリリーク有無の判定について説明する。
図7は、メモリリーク判定部23が、メモリリーク有りと判定する例を示すグラフであり、メモリ使用量取得部21が取得する、あるプロセスのメモリ使用量の変化を示す。同図の縦軸はメモリサイズを示す。また、同図の横軸は時間軸であり、プロセスが起動してからの時間を示す。点P101〜P110は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。また、THRはメモリ使用量閾値であり、メモリ使用量初回取得時の点P101におけるメモリ使用量VPに、判定条件情報記憶部313が記憶するメモリ使用量閾値算出係数を乗じた値を示す。
【0024】
メモリリーク判定部23は、メモリ使用量情報記憶部312のメモリ使用量情報を参照して、メモリ使用量の現在値がメモリ使用量閾値以上であり、かつ、メモリ使用量最大値更新回数が判定条件情報記憶部313の記憶する更新回数閾値以上である場合にメモリリーク有りと判定する。以下、図7〜図10で説明する例では、更新回数閾値は「8」に設定されている。
図7の例では、点P109および点P110において、メモリ使用量の現在値がメモリ使用量閾値THR以上となっている。また、最大値更新回数計数部22は、メモリ使用量初回取得時の点P101では、最大値更新回数を「0」としてメモリ使用量情報記憶部312の最大値更新回数欄に書き込む。以降、点P102で最大値更新回数を「1」、点P103で「2」というように、最大値が更新される毎に最大値更新回数に1を加算してメモリ使用量情報記憶部312の最大値更新回数欄に書き込む。図7の場合、点P106では最大値が更新されていないので、点P110において、最大値更新回数が更新回数閾値の「8」に達する。
【0025】
あるプロセスにメモリリークが発生している場合、当該プロセスが確保したメモリ領域のうちメモリリークする領域が解放されないので、当該プロセスのメモリ使用量は図7に示すように時間経過に応じて増加していくと考えられる。そこで、メモリリーク判定部23は、メモリ使用量の最大値更新回数が更新回数閾値以上であることを、メモリリーク判定条件の1つとしている。一方、プロセスの正常動作においてメモリ使用量が増加する場合は、当該プロセスの確保したメモリ領域が処理終了後に解放されることにより、当該プロセスのメモリ使用量が一定の範囲内に収まる、すなわち一定値以上とならないことが期待できる。そこで、メモリリーク判定部23は、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減させるために、メモリ使用量の現在値が、メモリ使用量閾値THR以下である場合は、メモリ使用量の最大値更新回数が更新回数閾値以上か否かにかかわらず、メモリリーク無しと判定する。
【0026】
なお、メモリリーク判定部23が、メモリ使用量最大値の更新回数と更新回数閾値との比較のみでメモリリークの有無を判定するようにしてもよい。この場合、メモリ使用量の最大値更新回数が更新回数閾値以上となると、メモリリーク判定部23は、メモリ使用量の現在値にかかわらずメモリリーク有りと判定するので、より早い段階でメモリリークを検出し得る。
一方、上述のように、メモリ使用量最大値の更新回数が更新回数閾値以上であることに加えて、メモリ使用量の現在値がメモリ使用量閾値THR以上であることも判定条件とすることにより、正常動作におけるメモリ使用量の漸増によりメモリリーク有りと誤判定する可能性を低減できる。
【0027】
なお、プロセス起動直後は、プロセスが未だメモリ領域を確保しておらず、メモリ使用量が極端に小さい値を示すことが考えられる。このため、メモリ使用量取得部21が、メモリ使用量の初回取得値としてプロセス起動直後のメモリ使用量を取得し、この値に基づいてメモリ使用量閾値THRを算出すると、メモリ使用量閾値THRの値が極端に小さい値となり、上述した、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定の低減を行えないおそれがある。そこで、メモリ使用量取得部21は、プロセス起動から一定時間経過後の点P101において初回のメモリ使用量取得を行っている。
なお、プロセスが起動時に直ちにメモリ領域を確保するようプログラムされている場合は、メモリ使用量取得部21が、プロセス起動時に初回のメモリ使用量取得を行うようにしてもよい。これにより、メモリ使用量取得部21が、プロセス起動から一定時間経過後に初回のメモリ使用量取得を行う場合よりも更に早い段階でメモリリークを検出し得る。
【0028】
図8は、メモリリーク判定部が、メモリリーク無しと判定する第1の例を示すグラフであり、プロセスのメモリ使用量が一時的にメモリ使用量閾値以上となる例を示している。図7と同様、図8の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P201〜P210は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0029】
グラフ表示されているプロセスのメモリ使用量は、点P202においてメモリ使用量閾値THR以上となっているが、この時点でのメモリ使用量の最大値更新回数は「1」であり、更新回数閾値「8」未満なので、メモリリーク判定部23は、メモリリーク無しと判定する。また、点P203〜P210でのメモリ使用量は、点P202でのメモリ使用量以下なので、メモリ使用量の最大値更新回数は「1」のまままである。このため、メモリ使用量の最大値更新回数が「0」の点P201も含め、点P201および点P203〜P210でも、メモリリーク判定部23は、メモリリーク無しと判定する。なお、点P201および点P203〜210では、メモリ使用量の現在値がメモリ使用量閾値THR未満であることからも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0030】
このように、メモリリーク判定部23は、メモリ使用量の最大値更新回数に基づいてメモリリークの有無を判定するので、メモリ使用量とメモリ使用量閾値との比較のみでメモリリークの判定を行う方法とは異なり、プロセスの正常動作において増減するメモリ使用量が、一時的にメモリ使用量閾値よりも大きくなった場合に、メモリリーク有りと誤判定する可能性を低減できる。
【0031】
図9は、メモリリーク判定部が、メモリリーク無しと判定する第2の例を示すグラフであり、プロセスが定期的に一定のメモリ領域を確保する場合の例を示している。図7〜図8と同様、図9の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P301〜P310は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0032】
グラフ表示されているプロセスのメモリ使用量は、点P302においてメモリ使用量閾値THR以上となっているが、この時点でのメモリ使用量の最大値更新回数は「1」であり、更新回数閾値「8」未満なので、メモリリーク判定部23は、メモリリーク無しと判定する。また、点P306および点P309でのメモリ使用量は、点P303でのメモリ使用量と同じであり、点P304〜P310でメモリ使用量の最大値更新回数は「1」のままである。このため、メモリ使用量の最大値更新回数が「0」の点P301〜P302も含め、点P301〜P302および点P304〜P310でも、メモリリーク判定部23は、メモリリーク無しと判定する。なお、点P301とP302とP304とP305とP307とP308とP310とでは、メモリ使用量の現在値がメモリ使用量閾値THR未満であることからも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0033】
このように、メモリリーク判定部23は、メモリ使用量の最大値更新回数に基づいてメモリリークの有無を判定するので、メモリ使用量とメモリ使用量閾値との比較のみでメモリリークの判定を行う方法とは異なり、プロセスの正常動作において増減するメモリ使用量が、定期的にメモリ使用量閾値よりも大きくなる場合にも、メモリリーク有りと誤判定する可能性を低減できる。
【0034】
図10は、メモリリーク判定部が、メモリリーク無しと判定する第3の例を示すグラフであり、プロセスのメモリ使用量がメモリ使用量閾値未満の範囲で変化する場合の例を示している。図7〜図9と同様、図10の縦軸はメモリサイズを示し、横軸はプロセスが起動してからの時間を示す。点P401〜P410は、それぞれの時間においてメモリ使用量取得部21が取得する、当該プロセスのメモリ使用量を示す。THRはメモリ使用量閾値を示す。
【0035】
同図の例では、点P402〜P409でメモリ使用量の最大値が更新され、点409で最大値更新回数が更新回数閾値と同じ「8」となっている。しかし、点P409の現在値は判定閾値THRよりも小さいため、メモリリーク判定部23は、点P409でメモリリーク無しと判定する。また、点P401〜P408およびP410でも、メモリ使用量はメモリ使用量閾値未満であり、メモリリーク判定部23はメモリリーク無しと判定する。なお、点P401〜P408では、メモリ使用量の最大値更新回数は、更新回数閾値「8」未満であり、この点でも、メモリリーク判定部23は、メモリリーク無しと判定する。
【0036】
プロセスの正常動作においてメモリ使用量が増加する場合は、当該プロセスの確保したメモリ領域が処理終了後に解放されることにより、例えば図10の点P410のように、メモリ使用量が減少することが期待できる。これにより、当該プロセスのメモリ使用量が一定の範囲内に収まる、すなわち一定値以上とならないことが期待できる。そこで、前述したように、メモリリーク判定部23は、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減させるために、メモリ使用量の現在値が、メモリ使用量閾値THR以上であることを、メモリリーク判定条件の1つとしている。
【0037】
次に、図11を参照して、メモリリーク判定装置1の動作について説明する。
図11は、メモリリーク判定装置1が、ある1つのプロセスに関して行う、メモリリーク有無の判定処理手順を示す図である。メモリリーク判定装置1は、新たにプロセスが実行されると同図の処理を開始する。以下では、同図でメモリリーク有無の判定対象となるプロセスを「対象プロセス」という。
新たに対象プロセスが実行されると、例えばOS(Operating System)が、対象プロセスのプロセスIDとプロセス名と実行開始時刻とをメモリ使用量取得部21に出力する。メモリ使用量取得部21は、OSから出力されたプロセスIDとプロセス名と実行開始時刻とを対応付けて、プロセス情報記憶部311が記憶するプロセス情報に追加する。また、メモリ使用量取得部21は、OSから出力されたプロセスIDとプロセス名とを対応付けて、メモリ使用量情報記憶部312が記憶するメモリ使用量情報に追加する(以上、ステップS101)。
【0038】
その後、メモリ使用量取得部21は、所定の時間経過を待って(ステップS102)、対象プロセスのメモリ使用量を取得する(ステップS103)。
所定の時間経過を待つのは、上述したように、対象プロセスが未だメモリ領域を確保していない状態における、極端に小さいメモリ使用量に基づいて、メモリ使用量閾値THRを算出することを防止するためである。ステップS102での待ち時間は、判定条件情報記憶部313が記憶する判定時間間隔と同じであってもよいし、判定時間間隔とは別に定められた時間であってもよい。例えば、ユーザが、プロセスの正常動作時における時間毎のメモリ使用量の統計をとり、この統計に基づいてステップS102の待ち時間とメモリ使用量閾値算出係数とを決定して判定条件情報記憶部313に書き込むようにしてもよい。
メモリ使用量取得部21は、例えば、実行中の各プロセスのプロセスIDとプロセス名とメモリ使用量との出力をOSから随時受けており、ステップS102の所定時間経過時にOSから出力されるメモリ使用量を、メモリ使用量取得値とする。
【0039】
メモリ使用量取得部21は、取得したメモリ使用量を、メモリ使用量情報記憶部312の記憶するメモリ使用量情報の、対象プロセスの行の初期値欄と最大値欄と現在値欄とに書き込む。また、メモリ使用量取得部21は、判定条件情報記憶部313からメモリ使用量閾値算出係数を読み出し、読み出したメモリ使用量閾値算出係数を、先に取得したメモリ使用量に乗じることにより、メモリ使用量閾値を算出する。メモリ使用量取得部21は、算出したメモリ使用量閾値を、メモリ使用量情報の対象プロセスの行のメモリ使用量閾値欄に書き込む。さらに、メモリ使用量取得部21は、メモリ使用量情報の対象プロセスの行の最大値更新回数欄に「0」を書き込む。加えて、メモリ使用量取得部21は、判定条件情報記憶部313から判定時間間隔を読み出し、読み出した判定時間間隔を、ステップS103においてメモリ使用量を取得した時刻に加えることにより、対象プロセスのメモリリーク有無の判定を次に行う時刻を算出する。メモリ使用量取得部21は、算出した時刻を、プロセス情報の当該プロセスの行の次回時刻欄に書き込む(以上、ステップS104)。
【0040】
そして、メモリ使用量取得部21は、次回時刻に書き込んだ時刻となるまで時間経過待ちを行う(ステップS105)。その後、メモリ使用量取得部21は、対象プロセスが実行中か否かを判定する。例えば、メモリ使用量取得部21は、OSから随時出力される実行中のプロセスの情報に、対象プロセスのプロセスIDとプロセス名とが含まれている場合は、対象プロセスが実行中であると判定する。一方、対象プロセスのプロセスIDとプロセス名とが含まれていない場合は、メモリ使用量取得部21は、対象プロセスが実行中ではないと判定する(以上、ステップS106)。対象プロセスが実行中でないと判定した場合(ステップS106:NO)、メモリ使用量取得部21は、プロセス情報とメモリ使用量情報とから、対象プロセスの行を削除する(ステップS121)。その後、図11の処理を終了する。
【0041】
一方、ステップS106で、対象プロセスが実行中であると判定した場合(ステップS106:YES)、メモリ使用量取得部21は、対象プロセスのメモリ使用量を取得し(ステップS107)、メモリ使用量情報記憶部312が記憶する対象プロセスのメモリ使用量の現在値を、取得したメモリ使用量に更新する。
また、メモリ使用量取得部21は、プロセス情報記憶部311が記憶するプロセス情報から次回時刻を読み出す。上述したように、次回時刻は、メモリリーク判定装置1(のメモリリーク判定部23)が、次に対象プロセスのメモリリークを判定する時刻を示す情報である。また、メモリ使用量取得部21は、判定条件情報記憶部313が記憶する判定条件情報から、判定時間間隔を読み出す。メモリ使用量取得部21は、読み出した次回時刻に判定時間間隔を加えることにより新たな次回時刻を算出し、プロセス情報記憶部311の記憶する対象プロセスの次回時刻を、算出した次回時刻に更新する。
【0042】
その後、メモリ使用量取得部21は、メモリ使用量の現在値を更新したことを示す信号を最大値更新回数計数部22に出力する。例えば、メモリ使用量取得部21は、メモリ使用量現在値を更新したことを示す信号に対象プロセスのプロセスIDを含めて出力する。これにより、最大値更新回数計数部22は、対象プロセスがどのプロセスかを把握できる(以上、ステップS108)。
【0043】
最大値更新回数計数部22は、メモリ使用量の現在値を更新したことを示す信号の出力を受けると、対象プロセスのメモリ使用量の現在値と最大値とをメモリ使用量情報記憶部312から読み出す。そして、最大値更新回数計数部22は、最大値が更新されたか否か、すなわち、読み出した現在値が最大値よりも大きいか否かを判定する(以上、ステップS109)。最大値が更新されたと判定した場合(ステップS109:YES)、最大値更新回数計数部22は、メモリ使用量情報記憶部312の記憶する、対象プロセスのメモリ使用量の最大値欄に、対象プロセスのメモリ使用量の現在値を書き込む。また、最大値更新回数計数部22は、メモリ使用量情報記憶部312の記憶する、対象プロセスのメモリ使用量の最大値更新回数を、当該最大値更新回数に1を加えた値に更新する。
その後、最大値更新回数計数部22は、メモリ使用量取得部21から出力された、メモリ使用量の現在値を更新したことを示す信号を、メモリリーク判定部23に出力(転送)する(以上、ステップS110)。
【0044】
メモリリーク判定部23は、メモリ使用量の現在値を更新したことを示す信号の出力を受けると、対象プロセスに関するメモリリークの有無を判定する。上述したように、メモリリーク判定部23は、メモリ使用量情報記憶部312から、対象プロセスのメモリ使用量の現在値Mと、最大値更新回数Uと、メモリ使用量閾値TMとを読み出し、判定条件情報記憶部313から、更新回数閾値TUを読み出す。そして、メモリリーク判定部23は、式(1)が成立する場合は、対象プロセスに関してメモリリーク有りと判定し、成立しない場合は、対象プロセスに関してメモリリーク無しと判定する(以上ステップS111)。
M≧TM、かつ、U≧TU ・・・ 式(1)
【0045】
メモリリーク有りと判定した場合(ステップS111:YES)、メモリリーク判定部23は、対策処理の実行を指示する信号に対象プロセスのプロセスIDを含めて対策処理実行部24に出力する。
対策処理実行部24は、対策処理の実行を指示する信号の出力を受けると、メモリリークに対する対策処理を実行する。具体的には、対策処理実行部24は、対策処理の実行を指示する信号から対象プロセスのプロセスIDを読み出し、また、処理内容情報記憶部314から、選択フラグが「○」になっている処理の実行コマンドを読み出す。そして、対策処理実行部24は、読み出したプロセスIDが示す対象プロセスに関して、読み出した実行コマンドを実行する(以上ステップS112)。その後、ステップS105に戻る。
【0046】
一方、ステップS109において、最大値が更新されていないと判定した場合(ステップS109:NO)はステップS111に進む。すなわち、最大値および最大値更新回数を更新せずに、メモリリーク有無の判定に進む。
また、ステップS111でメモリリーク無しと判定した場合(ステップS111:NO)はステップS105に戻る。すなわち、メモリリークに対する対策処理を行わずに、次回時刻到達を待ち受ける。
【0047】
以上のように、メモリリーク判定装置1のメモリリーク判定部23は、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かに基づいてメモリリークの有無を判定する。したがって、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置と比較すると、メモリリーク判定装置1は、メモリ使用量が当該閾値未満の、より早い段階でメモリリークを検出できる。この点で、メモリリーク判定装置1は、メモリリークの発生を早期に検知できる。
また、実際にはメモリリークが発生しておらず、対象プロセスのメモリ使用量が一時的に増加したに過ぎない場合、メモリリーク判定装置1は、対象プロセスのメモリ使用量の最大値更新回数に基づいて、メモリリーク無しと判定し得る。
【0048】
また、比較的大きなメモリ領域を確保するプロセスが一定時間以上実行状態にある場合など、メモリ使用量増加率が大きな値となる場合でも、メモリリークが発生していない場合は、メモリ使用量が一定の範囲内に収まり、メモリ使用量の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、メモリリーク判定装置1は、メモリリーク無しと判定できる。この点で、メモリリーク判定装置1は、メモリ使用量増加率の大小にかかわらず、メモリリークの有無について誤判定を行うおそれが少ない。
さらに、メモリリークが発生している場合は、メモリ使用量の増加率の大小にかかわらず、メモリ使用量が増加し続けることが考えられる。メモリ使用量の増加率が小さい場合でも、メモリリーク検出装置1は、メモリ使用量の最大値更新回数が更新回数閾値以上、かつ、メモリ使用量がメモリ使用量閾値以上となった時点で、メモリ使用量が増加し続けていることを検出し、メモリリーク有りと判定できる。この点でも、メモリリーク判定装置1は、メモリ使用量増加率の大小にかかわらず、メモリリークの有無について誤判定を行うおそれが少ない。
【0049】
また、メモリリーク判定部23は、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのメモリ使用量の現在値がメモリ使用量閾値以上か否かに基づいてメモリリークの有無を判定する。これにより、メモリリークが発生しておらず、対象プロセスのメモリ使用量が一定の範囲内に収まる場合に、プロセスの正常動作におけるメモリ使用量の漸増によりメモリリーク有りとする誤判定を低減できる。
また、メモリリーク判定装置1は、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置と比較すると、メモリ使用量閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのメモリ使用量が一時的にあるいは定期的にメモリ使用量閾値以上となる場合でも、対象プロセスのメモリ使用量の最大値更新回数が最大値更新回数閾値以上か否かの判定により、メモリリークが発生していないにもかかわらずメモリリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのメモリ使用量が閾値以上か否かのみでメモリリークの有無を判定するメモリリーク判定装置よりも、対象プロセスのメモリ使用量が小さい段階で、すなわち、より早期にメモリリークを検出できる。
【0050】
また、メモリリーク判定装置1では、メモリ使用量取得部21は、メモリ使用量の初期値にメモリ使用量閾値算出係数を乗じた値、すなわち、メモリ使用量の初期値を所定定数倍した値をメモリ使用量閾値とし、メモリリーク判定部23は、このメモリ使用量閾値を用いてメモリリークの有無を判定する。このように、メモリリーク判定部23は、判定対象のプロセスの規模に応じて設定されたメモリ使用量閾値を用いてメモリリーク有無を判定するので、より正確にメモリリーク有無を判定できることが期待できる。
【0051】
なお、メモリリーク判定部23が、複数のプロセスについて纏めてメモリリークの有無を判定するようにしてもよい。例えば、メモリ使用量取得部21は、実行中の全プロセスについてメモリ使用量を取得し、実行中の全プロセスのメモリ使用量を実行中のプロセス数で除したメモリ使用量平均値を算出する。メモリリーク判定部23は、メモリ使用量取得部21が算出したメモリ使用量平均値について、当該メモリ使用量平均値の最大値更新回数が更新回数閾値以上、かつ、当該メモリ使用量平均値がメモリ使用量平均値閾値以上のときに、メモリリーク有りと判定する。
このように、複数のプロセスについて纏めてメモリリークの有無を判定することにより、メモリ使用量情報等をプロセス毎に記憶する必要が無いので、メモリリーク判定に用いるメモリ容量を低減できる。
【0052】
なお、メモリリーク判定部23がメモリリークの有無の判定に用いるメモリ使用量閾値は、上述したメモリ使用量の初期値に基づくものに限らない。例えば、プロセスの種類に応じて、メモリ使用量閾値が予め定められていてもよい。これにより、メモリ使用量取得部がメモリ使用量閾値を算出する負荷を削減できる。
【0053】
<第1の変形例>
以上ではメモリリークの有無の判定を行う場合について説明したが、本発明は、プロセスがオープンしたファイルのクローズ漏れ(以下では、「ファイルリーク」という)の有無の判定にも適用できる。
ファイルリークが発生すると、クローズ漏れしたファイルのメモリ領域が解放されないことによりメモリリークが生じる。また、クローズ漏れしたファイルの解放を待っているプロセスが存在する場合、当該プロセスが当該ファイルを取得でないことにより、当該プロセス、ひいてはコンピュータの処理速度低下や動作不安定化が生じるおそれがある。
【0054】
図12は、本発明の第1の変形例におけるファイルリーク判定装置の概略構成を示す構成図である。同図において、ファイルリーク判定装置(コンピュータ資源解放漏れ判定装置)4は、操作入力部11と、表示部12と、オープンファイル数取得部(コンピュータ資源使用量取得部)51と、最大値更新回数計数部52と、ファイルリーク判定部(解放漏れ判定部)53と、対策処理実行部24と、記憶部61とを具備する。記憶部61は、プロセス情報記憶部311と、オープンファイル数情報記憶部612と、判定条件情報記憶部613と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
同図において、図1の各部と同様の機能を有する部分には、同一の符号(11、12、24、311、314、315)を付し、説明を省略する。
【0055】
オープンファイル数情報記憶部612は、実行中の各プロセスのメモリ使用量の初期値と最大値と現在値とに換えて、実行中の各プロセスのオープンファイル数の初期値と最大値と現在値とを記憶する点、および、メモリ使用量閾値に代えて、オープンファイル数閾値(オープンファイル数の現在値に対する判定閾値)を記憶する点で、図1のメモリ使用量情報記憶部312と異なる。
判定条件情報記憶部613は、メモリ使用量閾値算出係数に換えて、オープンファイル数閾値算出係数を記憶する点で、図1の判定条件情報記憶部313と異なる。オープンファイル数閾値算出係数は、オープンファイル数情報記憶部612が記憶するオープンファイル数初期値に乗じることにより、同じくオープンファイル数情報記憶部612が記憶するオープンファイル数閾値を算出するための係数である。
【0056】
オープンファイル数取得部51は、実行中の各プロセスのオープンファイル数をOSから取得し、各プロセスのオープンファイル数の初期値や現在値やオープンファイル数閾値を含むオープンファイル数情報を、オープンファイル数情報記憶部612に書き込む点で、実行中の各プロセスのメモリ使用量をOSから取得し、各プロセスのメモリ使用量の初期値や現在値やメモリ使用量閾値を含むメモリ使用量情報を、メモリ使用量情報記憶部312に書き込む図1のメモリ使用量取得部21と異なる。
最大値更新回数計数部52は、オープンファイル数の最大値が更新されたか否かを判定し、更新されたと判定した場合は、オープンファイル数情報記憶部612が記憶するオープンファイル数の最大値と最大値更新回数とを更新する点で、メモリ使用量の最大値が更新されたか否かを判定し、更新されたと判定した場合には、メモリ使用量情報記憶部312が記憶するメモリ使用量の最大値と最大値更新回数とを更新する図1の最大値更新回数計数部22と異なる。
ファイルリーク判定部53は、オープンファイル数情報記憶部612からオープンファイル数の現在値と最大値更新回数とオープンファイル数閾値とを読み出し、判定条件情報記憶部613から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、オープンファイル数の現在値がオープンファイル数閾値以上である場合にファイルリーク有りと判定する点で、メモリ使用量情報記憶部312からメモリ使用量の現在値と最大値更新回数とメモリ使用量閾値とを読み出し、判定条件情報記憶部313から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上である場合にメモリリーク有りと判定する図1のメモリリーク判定部23と異なる。
【0057】
ファイルリーク判定装置4は、オープンファイル数の最大値更新回数に基づいてファイルリークの有無を判定するので、オープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置と比較すると、オープンファイル数が当該閾値未満の、より早い段階でファイルリークを検出できる。
また、実際にはファイルリークが発生しておらず、ファイルリーク判定対象のプロセス(以下、「対象プロセス」という)のオープンファイル数が一時的に増加したに過ぎない場合、ファイルリーク判定装置4は、対象プロセスのオープンファイル数の最大値更新回数に基づいて、ファイルリーク無しと判定し得る。
【0058】
また、多数のファイルを使用するプロセスが一定時間以上実行状態にある場合など、オープンファイル数増加率が大きな値となる場合でも、ファイルリークが発生していない場合は、オープンファイル数が一定の範囲内に収まり、オープンファイル数の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、ファイルリーク判定装置4は、ファイルリーク無しと判定できる。この点で、ファイルリーク判定装置1は、オープンファイル数増加率の大小にかかわらず、ファイルリークの有無について誤判定を行うおそれが少ない。
さらに、ファイルリークが発生している場合は、オープンファイル数の増加率の大小にかかわらず、オープンファイル数が増加し続けることが考えられる。オープンファイル数の増加率が小さい場合でも、ファイルリーク検出装置4は、オープンファイル数の最大値更新回数が更新回数閾値以上、かつ、オープンファイル数がオープンファイル数閾値以上となった時点で、オープンファイル数が増加し続けていることを検出し、ファイルリーク有りと判定できる。この点でも、ファイルリーク判定装置4は、オープンファイル数増加率の大小にかかわらず、ファイルリークの有無について誤判定を行うおそれが少ない。
【0059】
また、ファイルリーク判定部53は、対象プロセスのオープンファイル数の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのオープンファイル数の現在値がオープンファイル数閾値以上か否かに基づいてファイルリークの有無を判定する。これにより、ファイルリークが発生しておらず、対象プロセスのオープンフィル数が一定の範囲内に収まる場合に、プロセスの正常動作におけるオープンファイル数の漸増によりファイルリーク有りとする誤判定を低減できる。
また、ファイルリーク判定装置4は、プロセスのオープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置と比較すると、オープンファイル数閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのオープンファイル数が一時的にあるいは定期的にオープンファイル数閾値以上となる場合でも、対象プロセスのオープンファイル数の最大値更新回数が最大値更新回数閾値以上か否かの判定により、ファイルリークが発生していないにもかかわらずファイルリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのオープンファイル数が閾値以上か否かのみでファイルリークの有無を判定するファイルリーク判定装置よりも、対象プロセスのオープンファイル数が小さい段階で、すなわち、より早期にファイルリークを検出できる。
【0060】
また、ファイルリーク判定装置4では、オープンファイル数取得部51は、オープンファイル数の初期値にオープンファイル数閾値算出係数を乗じた値、すなわち、オープンファイル数の初期値を所定定数倍した値をオープンファイル数閾値とし、ファイルリーク判定部53は、このオープンファイル数閾値を用いてファイルリークの有無を判定する。このように、ファイルリーク判定部53は、判定対象のプロセスの規模に応じて設定されたオープンファイル数閾値用いてファイルリーク有無を判定するので、より正確にファイルリーク有無を判定できることが期待できる。
【0061】
<第2の変形例>
また、本発明は、マルチスレッド処理を行うプロセスのスレッド終了漏れ(以下では、「スレッドリーク」という)の有無の判定にも適用できる。
スレッドリークが発生すると、終了漏れしたスレッドが使用する資源の解放漏れが生じ、この解放漏れした資源を他のプロセスや他のスレッドが使用でないことにより、当該プロセス、ひいてはコンピュータの処理速度低下や動作不安定化が生じるおそれがある。
【0062】
図13は、本発明の第2の変形例におけるスレッドリーク判定装置の概略構成を示す構成図である。同図において、スレッドリーク判定装置(コンピュータ資源解放漏れ判定装置)7は、操作入力部11と、表示部12と、スレッド数取得部(コンピュータ資源使用量取得部)81と、最大値更新回数計数部82と、スレッドリーク判定部(解放漏れ判定部)83と、対策処理実行部24と、記憶部91とを具備する。記憶部91は、プロセス情報記憶部311と、スレッド数情報記憶部912と、判定条件情報記憶部913と、処理内容情報記憶部314と、処理結果情報記憶部315とを具備する。
同図において、図1の各部と同様の機能を有する部分には、同一の符号(11、12、24、311、314、315)を付し、説明を省略する。
【0063】
スレッド数情報記憶部912は、実行中の各プロセスのメモリ使用量の初期値と最大値と現在値とに換えて、実行中の各プロセスのスレッド数の初期値と最大値と現在値とを記憶する点、および、メモリ使用量閾値に代えて、スレッド数閾値(スレッド数の現在値に対する判定閾値)を記憶する点で、図1のメモリ使用量情報記憶部312と異なる。
判定条件情報記憶部913は、メモリ使用量閾値算出係数に換えて、スレッド数閾値算出係数を記憶する点で、図1の判定条件情報記憶部313と異なる。スレッド数閾値算出係数は、スレッド数情報記憶部912が記憶するスレッド数初期値に乗じることにより、同じくスレッド数情報記憶部912が記憶するスレッド数閾値を算出するための係数である。
【0064】
スレッド数取得部81は、実行中の各プロセスのスレッド数をOSから取得し、各プロセスのスレッド数の初期値や現在値やスレッド数閾値を含むスレッド数情報を、スレッド数情報記憶部912に書き込む点で、実行中の各プロセスのメモリ使用量をOSから取得し、各プロセスのメモリ使用量の初期値や現在値やメモリ使用量閾値を含むメモリ使用量情報を、メモリ使用量情報記憶部312に書き込む図1のメモリ使用量取得部21と異なる。
最大値更新回数計数部82は、スレッド数の最大値が更新されたか否かを判定し、更新されたと判定した場合は、スレッド数情報記憶部912が記憶するスレッド数の最大値と最大値更新回数とを更新する点で、メモリ使用量の最大値が更新されたか否かを判定し、更新されたと判定した場合には、メモリ使用量情報記憶部312が記憶するメモリ使用量の最大値と最大値更新回数とを更新する図1の最大値更新回数計数部22と異なる。
スレッドリーク判定部83は、スレッド数情報記憶部912からスレッド数の現在値と最大値更新回数とスレッド数閾値とを読み出し、判定条件情報記憶部913から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、スレッド数の現在値がスレッド数閾値以上である場合にスレッドリーク有りと判定する点で、メモリ使用量情報記憶部312からメモリ使用量の現在値と最大値更新回数とメモリ使用量閾値とを読み出し、判定条件情報記憶部313から更新回数閾値を読み出して、最大値更新回数閾値が更新回数閾値以上であり、かつ、メモリ使用量の現在値がメモリ使用量閾値以上である場合にメモリリーク有りと判定する図1のメモリリーク判定部23と異なる。
【0065】
スレッドリーク判定装置7は、スレッド数の最大値更新回数に基づいてスレッドリークの有無を判定するので、スレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置と比較すると、スレッド数が当該閾値未満の、より早い段階でスレッドリークを検出できる。
また、実際にはスレッドリークが発生しておらず、スレッドリーク判定対象のプロセス(以下、「対象プロセス」という)のスレッド数が一時的に増加したに過ぎない場合、スレッドリーク判定装置7は、対象プロセスのスレッド数の最大値更新回数に基づいて、スレッドリーク無しと判定し得る。
【0066】
また、多数のスレッドを使用するプロセスが一定時間以上実行状態にある場合など、スレッド数増加率が大きな値となる場合でも、スレッドリークが発生していない場合は、スレッド数が一定の範囲内に収まり、スレッド数の最大値更新回数が最大値更新回数閾値を超えないことが期待できる。この場合、スレッドリーク判定装置4は、スレッドリーク無しと判定できる。この点で、スレッドリーク判定装置7は、スレッド数増加率の大小にかかわらず、スレッドリークの有無について誤判定を行うおそれが少ない。
さらに、スレッドリークが発生している場合は、スレッド数の増加率の大小にかかわらず、スレッド数が増加し続けることが考えられる。スレッド数の増加率が小さい場合でも、スレッドリーク検出装置7は、スレッド数の最大値更新回数が更新回数閾値以上、かつ、スレッド数がスレッド数閾値以上となった時点で、スレッド数が増加し続けていることを検出し、スレッドリーク有りと判定できる。この点でも、スレッドリーク判定装置7は、スレッド数増加率の大小にかかわらず、スレッドリークの有無について誤判定を行うおそれが少ない。
【0067】
また、スレッドリーク判定部83は、対象プロセスのスレッド数の最大値更新回数が最大値更新回数閾値以上か否かに加えて、対象プロセスのスレッド数の現在値がスレッド数閾値以上か否かに基づいてスレッドリークの有無を判定する。これにより、スレッドリークが発生しておらず、対象プロセスのオープンフィル数が一定の範囲内に収まる場合に、プロセスの正常動作におけるスレッド数の漸増によりスレッドリーク有りとする誤判定を低減できる。
また、スレッドリーク判定装置7は、プロセスのスレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置と比較すると、スレッド数閾値を小さい値に設定しても誤判定の可能性を低減できる。なぜなら、対象プロセスのスレッド数が一時的にあるいは定期的にスレッド数閾値以上となる場合でも、対象プロセスのスレッド数の最大値更新回数が最大値更新回数閾値以上か否かの判定により、スレッドリークが発生していないにもかかわらずスレッドリーク有りとする誤判定の可能性を低減し得るからである。
したがって、プロセスのスレッド数が閾値以上か否かのみでスレッドリークの有無を判定するスレッドリーク判定装置、対象プロセスのスレッド数が小さい段階で、すなわち、より早期にスレッドリークを検出できる。
【0068】
また、スレッドリーク判定装置7では、スレッド数取得部81は、スレッド数の初期値にスレッド数閾値算出係数を乗じた値、すなわち、スレッド数の初期値を所定定数倍した値をスレッド数閾値とし、スレッドリーク判定部83は、このスレッド数閾値を用いてスレッドリークの有無を判定する。このように、スレッドリーク判定部83は、判定対象のプロセスの規模に応じて設定されたスレッド数閾値を用いてスレッドリークの有無を判定するので、より正確にスレッドリーク有無を判定できることが期待できる。
【0069】
なお、上述したように、メモリリーク判定装置1を、コンピュータ内に実現してもよい。同様に、ファイルリーク判定装置4やスレッドリーク判定装置7も、コンピュータ内に実現してもよい。具体的には、メモリリーク判定装置1や、ファイルリーク判定装置4や、スレッドリーク判定装置7の全部または一部の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより各部の処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、OSや周辺機器等のハードウェアを含むものとする。
また、「コンピュータシステム」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであってもよい。
【0070】
以上、本発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計変更等も含まれる。
【産業上の利用可能性】
【0071】
本発明は、資源解放漏れ判定装置、メモリリーク判定装置、資源解放漏れ判定方法およびプログラムに用いて好適である。
【符号の説明】
【0072】
1 メモリリーク判定装置
11 操作入力部
12 表示部
21 メモリ使用量取得部
22、52、82 最大値更新回数計数部
23 メモリリーク判定部
24 対策処理実行部
31、61、91 記憶部
311 プロセス情報記憶部
312 メモリ使用量情報記憶部
313、613、913 判定条件情報記憶部
314 処理内容情報記憶部
315 処理結果情報記憶部
4 ファイルリーク判定装置
51 オープンファイル数取得部
53 ファイルリーク判定部
612 オープンファイル数情報記憶部
7 スレッドリーク判定装置
81 スレッド数取得部
83 スレッドリーク判定部
912 スレッド数情報記憶部
【特許請求の範囲】
【請求項1】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置であって、
前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得部と、
前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数部と、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定部と、
を具備することを特徴とする資源解放漏れ判定装置。
【請求項2】
プロセスがメモリを使用する際のメモリリークの有無を判定するメモリリーク判定装置であって、
前記プロセスのメモリ使用量を取得するメモリ使用量取得部と、
前記メモリ使用量取得部が取得する前記メモリ使用量の最大値更新回数を計数する最大値更新回数計数部と、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記メモリリークの有無を判定するメモリリーク判定部と、
を具備することを特徴とするメモリリーク判定装置。
【請求項3】
前記メモリリーク判定部は、前記最大値更新回数が所定の回数より以上となり、かつ、前記メモリ使用量が閾値以上となった場合に、前記メモリリーク有りと判定することを特徴とする請求項2に記載のメモリリーク判定装置。
【請求項4】
前記メモリリーク判定部は、前記メモリ使用量取得部が最初に取得した前記メモリ使用量であるメモリ使用量初期値を所定定数倍した値を前記閾値とすることを特徴とする請求項3に記載のメモリリーク判定装置。
【請求項5】
前記メモリ使用量取得部は、複数の前記プロセスのメモリ使用量の合計値を前記メモリ使用量として取得することを特徴とする請求項2から4のいずれか1項に記載のメモリリーク判定装置。
【請求項6】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置の資源漏れ判定方法であって、
コンピュータ資源使用量取得部が、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、
最大値更新回数計数部が、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、
解放漏れ判定部が、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、
を具備することを特徴とする資源解放漏れ判定方法。
【請求項7】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置としてのコンピュータに、
前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、
前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、
を実行させるためのプログラム。
【請求項1】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置であって、
前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得部と、
前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数部と、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定部と、
を具備することを特徴とする資源解放漏れ判定装置。
【請求項2】
プロセスがメモリを使用する際のメモリリークの有無を判定するメモリリーク判定装置であって、
前記プロセスのメモリ使用量を取得するメモリ使用量取得部と、
前記メモリ使用量取得部が取得する前記メモリ使用量の最大値更新回数を計数する最大値更新回数計数部と、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記メモリリークの有無を判定するメモリリーク判定部と、
を具備することを特徴とするメモリリーク判定装置。
【請求項3】
前記メモリリーク判定部は、前記最大値更新回数が所定の回数より以上となり、かつ、前記メモリ使用量が閾値以上となった場合に、前記メモリリーク有りと判定することを特徴とする請求項2に記載のメモリリーク判定装置。
【請求項4】
前記メモリリーク判定部は、前記メモリ使用量取得部が最初に取得した前記メモリ使用量であるメモリ使用量初期値を所定定数倍した値を前記閾値とすることを特徴とする請求項3に記載のメモリリーク判定装置。
【請求項5】
前記メモリ使用量取得部は、複数の前記プロセスのメモリ使用量の合計値を前記メモリ使用量として取得することを特徴とする請求項2から4のいずれか1項に記載のメモリリーク判定装置。
【請求項6】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置の資源漏れ判定方法であって、
コンピュータ資源使用量取得部が、前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、
最大値更新回数計数部が、前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、
解放漏れ判定部が、前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、
を具備することを特徴とする資源解放漏れ判定方法。
【請求項7】
プロセスが使用するコンピュータ資源の解放漏れの有無を判定する資源解放漏れ判定装置としてのコンピュータに、
前記プロセスのコンピュータ資源使用量を取得するコンピュータ資源使用量取得ステップと、
前記コンピュータ資源使用量取得部が取得する前記コンピュータ資源使用量の最大値更新回数を計数する最大値更新回数計数ステップと、
前記最大値更新回数計数部が計数する前記最大値更新回数に基づいて、前記コンピュータ資源の解放漏れの有無を判定する解放漏れ判定ステップと、
を実行させるためのプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【公開番号】特開2011−233075(P2011−233075A)
【公開日】平成23年11月17日(2011.11.17)
【国際特許分類】
【出願番号】特願2010−105153(P2010−105153)
【出願日】平成22年4月30日(2010.4.30)
【出願人】(390001395)NECシステムテクノロジー株式会社 (438)
【Fターム(参考)】
【公開日】平成23年11月17日(2011.11.17)
【国際特許分類】
【出願日】平成22年4月30日(2010.4.30)
【出願人】(390001395)NECシステムテクノロジー株式会社 (438)
【Fターム(参考)】
[ Back to top ]