JP2008134709A - メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム - Google Patents

メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム Download PDF

Info

Publication number
JP2008134709A
JP2008134709A JP2006318800A JP2006318800A JP2008134709A JP 2008134709 A JP2008134709 A JP 2008134709A JP 2006318800 A JP2006318800 A JP 2006318800A JP 2006318800 A JP2006318800 A JP 2006318800A JP 2008134709 A JP2008134709 A JP 2008134709A
Authority
JP
Japan
Prior art keywords
request
memory leak
processing
generated
trace information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2006318800A
Other languages
English (en)
Other versions
JP4847300B2 (ja
Inventor
Masayoshi Nakamizo
昌佳 中溝
Masatoshi Yoshida
雅年 吉田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2006318800A priority Critical patent/JP4847300B2/ja
Priority to US11/851,723 priority patent/US20080127212A1/en
Publication of JP2008134709A publication Critical patent/JP2008134709A/ja
Application granted granted Critical
Publication of JP4847300B2 publication Critical patent/JP4847300B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/0709Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a distributed system consisting of a plurality of standalone computer nodes, e.g. clusters, client-server systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0751Error or fault detection not based on redundancy
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/10Providing a specific technical effect
    • G06F2212/1032Reliability improvement, data loss prevention, degraded operation etc

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)

Abstract

【課題】メモリリークが発生する条件を特定する技術を提供する。
【解決手段】受け付けたリクエストを特定する識別子と対応付けて、実行された処理の履歴をリクエストトレース情報に格納し、受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、受け付けたリクエストと生成されるオブジェクトとの対応情報と、オブジェクト生成のトレース情報を記録し、生成されたオブジェクトの使用を終了したとき、リクエストとオブジェクトとの対応情報を削除し、オブジェクト開放のトレース情報を記録し、メモリリークを検出する指示を受け付けたとき、リクエストトレース情報から実行中のリクエストの一覧を取得し、実行中のリクエスト一覧に含まれず、かつ、リクエストとオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する。
【選択図】図1

Description

本発明は、メモリリークが発生した処理を実行したリクエストを特定し、メモリリークの発生原因を特定する技術に関する。
近年、インターネット又はイントラネットを介し、主にWebベースのサービスを提供するシステムに対する要求が高まっている。このようなシステムを構築する場合、アプリケーションサーバとよばれるミドルウェアを使用し、アプリケーションサーバ上で動作するユーザアプリケーションを開発する手法が普及している。
アプリケーションサーバは、セキュリティ管理機能、トランザクション管理機能、リソースへのアクセス機能、コンポーネント管理機能などを提供する。このように、アプリケーションサーバを使用することによって、比較的容易に大規模かつ再利用性の高いシステムを構築することが可能となる。
アプリケーションサーバは、例えば、ユーザからのリクエストを受け付けて、指定された業務処理を実行する。アプリケーションサーバで実行されるユーザアプリケーションは、使用を終了したオブジェクトの解放を怠ると、アプリケーションサーバのメモリに領域を確保したまま残存する。そのため、時間の経過とともに、アプリケーションサーバ上で使用可能な空きメモリ空間が減少してしまう。このような現象は、メモリリークと呼ばれる。
アプリケーションサーバは、メモリリークが発生すると、最終的にはリクエストを処理するために必要なオブジェクトを生成できなくなるため、業務処理を継続することができなくなってしまう。特に、アプリケーションサーバは、複数のリクエストを効率的に処理するために、マルチスレッドで複数のユーザアプリケーションを実行する場合が多い。そのため、オブジェクトの解放を怠ったユーザアプリケーションだけではなく、アプリケーションサーバで実行される他のユーザアプリケーションがサービスを提供することが不可能になってしまうという問題がある。
また、アプリケーションサーバには、不要になったメモリ領域を自動的に解放するガーベジコレクションという機能が実装されている場合がある。しかし、ガーベジコレクションによってメモリを解放するシステムであっても、ユーザアプリケーションが使用を終了したオブジェクトの参照の解放を怠ると、メモリリークが発生してしまう。
さらに、ガーベジコレクションによってメモリを解放するシステムは、使用可能な空きメモリ空間が減少すると、アプリケーションサーバで実行されているすべてのスレッドを一旦停止させて解放可能なオブジェクトを探索する、フルガーベジコレクションを実行する。しかし、リークしたオブジェクトがすべて解放されるわけではないため、次第にフルガーベジコレクションが多発するようになってしまい、サービスのレスポンスタイムが長くなってしまうという問題が生じる。
前述のように、アプリケーションサーバで実行されるユーザアプリケーションにメモリリークが発生した場合、最終的にはサービスの継続が不可能になってしまう問題がある。そのため、ユーザアプリケーションにおいて、オブジェクト又はその参照を解放していない不具合があるためにメモリリークが発生した場合には、メモリリークの原因となっている不具合が発生する箇所及び不具合が発生する条件を迅速に特定することが重要となる。
メモリリーク及びその原因となる不具合の箇所を特定する方法は、従来より多種提案されている(例えば、特許文献1参照)。これらの方法を用いることによって、プロセス、ジョブ、又はスレッドごとに、解放されていないオブジェクトの種類及び量、当該オブジェクトを生成又は参照している箇所を特定することができる。
一方、アプリケーションサーバにおいて、リクエストのトレース情報を取得する方法が提案されている。トレース情報は、要求された業務処理を遂行するために実行された個々の処理の履歴を含む。例えば、リクエストの処理を開始した時点及び終了した時点、ユーザアプリケーションを構成するコンポーネントを呼び出した時点及び呼び出しから戻った時点、データベースなどのバックエンドシステムを呼び出した時点及び呼び出しから戻った時点など、リクエストを処理する過程での様々な情報が含まれる。
特開平11−203193号公報
メモリリーク及びメモリリークの原因箇所を特定する従来の方法では、プロセス、ジョブ、又はスレッドごとに、解放されていないオブジェクトの種類及び量、当該オブジェクトを生成又は参照している箇所を特定することができる。
しかし、ユーザアプリケーションにおいて、ある特定の種類のリクエストを処理した場合、又はリクエストを処理するためにある特定の順序でプログラムを実行した場合など、特定の条件を満たした場合のみメモリリークが発生することがあった。従来の方法では、このようなメモリリークが発生する条件を特定することは困難であった。
本発明は、メモリリークが発生する条件、例えば、メモリリークを発生させるリクエスト、及びリクエストの処理順序などによってメモリリークが発生する条件などを特定する技術を提供する。
本発明の代表的な一形態では、アプリケーションサーバにおいて、受け付けたリクエストに基づいて実行された処理のメモリリークを検出する方法であって、前記アプリケーションサーバは、インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、を備え、前記プロセッサは、前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除し、前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録し、前記アプリケーションサーバが、メモリリークを検出する指示を受け付けたとき、前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する。
本発明の一形態によれば、アプリケーションの不具合によって、特定の条件でのみメモリリークが発生する場合であっても、メモリリークの発生条件を容易に特定することが可能となる。
以下、本発明の実施の形態を図面に基づいて説明する。
図1は、本発明の実施の形態の計算機システムの装置構成の概要を示す説明図である。本発明の実施の形態の計算機システムでは、アプリケーションサーバ30と端末10がネットワーク20を介して接続される。端末10は、アプリケーションサーバ30に指定された業務処理の実行を要求するリクエストを送信する。
アプリケーションサーバ30は、通信装置50、CPU60、入力装置70、出力装置80、記憶装置85及びメモリ40を備える。通信装置50は、端末10に接続されるネットワーク20と接続する。CPU60は、メモリ40に格納されたプログラムを実行する。
入力装置70は、アプリケーションサーバ30に必要な情報の入力を受け付ける装置である。例えば、ユーザからメモリリークの検出指示を受け付ける。出力装置80は、アプリケーションサーバ30から出力される情報を表示する。例えば、メモリリークの疑いのあるオブジェクトの検出結果を表示する。記憶装置85は、プログラム及びプログラムの実行に必要なデータを格納する。記憶装置85は、例えば、ハードディスクである。
メモリ40は、リクエスト受付部101、プログラム群102、ユーザメモリ領域103、リクエストトレース部107、リクエストトレーステーブル108、オブジェクト管理部109、オブジェクトID管理部110、GC処理部111、オブジェクト管理テーブル112、UI113、メモリリーク解析部114、実行中リクエスト解析部115、及びリークオブジェクト解析部116を含む。なお、図中、太線で示された部分は、本発明の特徴的な構成を示している。メモリ40に記憶されたプログラム及びデータは、あらかじめメモリ40に記憶されていてもよいし、実行時に記憶装置85から読み出して記憶してもよい。
リクエスト受付部101は、端末10から送信されたリクエストを受け付け、コンテナプログラム104を実行する。また、リクエストの処理の開始及び終了などの履歴の出力を、リクエストトレース部107に依頼する。
プログラム群102は、コンテナプログラム104とユーザプログラム105などによって構成される。
ユーザメモリ領域103は、プログラム群102を構成するプログラムによって生成されたオブジェクト106を格納する。
コンテナプログラム104は、リクエスト処理におけるセキュリティ制御、トランザクション制御などを実行する。さらに、コンテナプログラム104は、ユーザプログラム105を実行する。
ユーザプログラム105は、業務処理を実行するためのユーザが作成したプログラムである。ユーザプログラム105は、受け付けたリクエストに従って、実際に業務処理を実行する。
また、ユーザプログラム105は、リクエストを処理するためにオブジェクトを使用する場合には、オブジェクト管理部109にオブジェクト生成を依頼し、ユーザメモリ領域に生成されたオブジェクト106を使用する。
さらに、ユーザプログラム105は、オブジェクト106の使用を終了した場合には、オブジェクト106に対するすべての参照を解放し、オブジェクト106をGC処理部111によって解放可能な状態にしておく。ただし、ユーザプログラム105に不具合がある場合など、使用を終了したオブジェクト106の参照の解放を怠ると、GC処理部111は、オブジェクト106を解放することができないため、メモリリークが発生してしまう。
リクエストトレース部107は、リクエストのトレース情報を管理する処理部である。リクエストトレース部107は、リクエストトレーステーブル108にリクエストのトレース情報を格納する。
オブジェクト管理部109は、ユーザメモリ領域103のオブジェクト106を管理する処理部である。オブジェクト管理部109は、ユーザプログラム105からの要求を受け付け、要求されたオブジェクト106を生成する。また、GC処理部111の要求を受け付けて、オブジェクト106をユーザメモリ領域103から解放する。
オブジェクトID管理部110は、オブジェクト106とリクエストの対応を管理する処理部である。オブジェクトID管理部110は、オブジェクト管理部109からの依頼によって、オブジェクト106とリクエストとの対応をオブジェクト管理テーブル112に登録又は削除する。
GC処理部111は、ユーザメモリ領域103の空きメモリ領域が少なくなった場合に、ユーザメモリ領域103に格納されているオブジェクト106のうち、破棄可能なオブジェクトを抽出し、オブジェクト管理部109にオブジェクトの解放を依頼する。
UI113は、管理者からメモリリークの検出要求を受け付け、メモリリーク解析部114にメモリリークの検出を指示するユーザインタフェースである。なお、UI113は、GUI(Graphical User Interface)又はCUI(Character_based User Interface)のいずれであってもよい。UI113は、ユーザからのメモリリーク検出指示を受け付け、メモリリークの疑いのあるオブジェクト一覧、リークの疑いのあるオブジェクトを生成したリクエスト一覧、及び指定されたリクエストのトレース情報を表示する。
メモリリーク解析部114は、UI113からメモリリークの解析を指示されると、まず、GC処理部111にフルガーベジコレクションを依頼する。そして、実行中リクエスト解析部115及びリークオブジェクト解析部116によって、リクエストが完了しているにもかかわらず、メモリから解放されていないオブジェクトの一覧であるリークオブジェクト一覧118を生成する。
実行中リクエスト解析部115は、リクエストトレーステーブル108に記憶されているトレース情報を参照し、リクエストが完了した旨が記録されていないリクエストの一覧である実行中リクエスト一覧117を生成する。
リークオブジェクト解析部116は、実行中リクエスト一覧117を参照し、オブジェクト管理テーブル112から、リクエストを実行中でないオブジェクトの一覧を取得する。すなわち、リクエストが完了しているにもかかわらず、参照が解放されておらず破棄されていないリークオブジェクト一覧118を生成する。
図2Aは、本発明の実施の形態のリクエストトレーステーブル108の一例を示す説明図である。リクエストトレーステーブル108は、リクエストIDフィールド201及びイベントフィールド202を含む。
リクエストIDフィールド201は、端末10から受け付けたリクエストを一意に識別するリクエストIDを格納する。リクエストIDは、リクエスト受付時にリクエストトレース部107によって生成される。イベントフィールド202は、リクエストを実行するための処理の処理ポイントを識別するイベント情報が時系列順に記録される。
リクエストトレーステーブル108に記録されるレコードは、受け付けたリクエストが処理されるとき、例えば、リクエストの処理開始及び終了、オブジェクトの生成及び削除などの処理ポイントごとに生成される。
図2Bは、本発明の実施の形態のオブジェクト管理テーブル112の一例を示す説明図である。オブジェクト管理テーブル112は、処理中のリクエストと当該リクエストの処理に伴って生成されたオブジェクトとの対応関係を格納する。オブジェクト管理テーブル112は、オブジェクトIDフィールド211及びリクエストIDフィールド212を含む。
オブジェクトIDフィールド211は、生成されたオブジェクトを識別するオブジェクトIDを格納する。オブジェクトIDは、オブジェクトを生成するとき、オブジェクトID管理部110によって生成される。
リクエストIDフィールド212は、リクエストトレーステーブル108のリクエストIDフィールド201と同じである。リクエストIDフィールド212は、オブジェクトIDフィールド211によって識別されるオブジェクトを生成したリクエストのリクエストIDを格納する。
アプリケーションサーバ30は、オブジェクトが生成されるとき、生成されたオブジェクトを識別するオブジェクトIDと、リクエスト受付時にリクエスト受付部101によって生成されたリクエストIDとをオブジェクト管理テーブル112に記録する。なお、生成されたオブジェクトにリクエストIDを記録してもよい。
ここで、端末10からリクエストを受け付けて、業務処理に必要なユーザプログラム105を実行し、オブジェクトが生成されてから解放されるまでの処理の概要を説明する。
受け付けたリクエストの処理は、大きく分けて、リクエスト開始処理、ユーザプログラム処理(オブジェクト生成処理)、及びリクエスト終了処理によって構成されている。
また、本発明の実施の形態では、GC処理部111によって、所定のタイミングでガーベジコレクションが実行され、使用を終了したオブジェクトがメモリから解放される。このとき、オブジェクト管理部109によって、ユーザプログラム処理(オブジェクト解放処理)が実行される。
図3Aは、本発明の実施の形態のリクエスト処理時のオブジェクト管理の処理の流れを示す説明図である。各矢印に付された括弧付きの符号は、処理順序を示し、図3B及び図3Cに記載された各符号に対応する。
図3Bは、本発明の実施の形態のリクエスト処理時のオブジェクト生成時の処理の流れを示す説明図である。
まず、リクエスト開始処理について説明する。端末10は、ネットワーク20を介してアプリケーションサーバ30に業務処理のリクエストを送信する(1)。
アプリケーションサーバ30は、リクエスト受付部101によって、端末10から送信されたリクエストを受信する。そして、リクエスト受付部101は、リクエストトレース部107にリクエスト処理の開始を通知する(2)。
リクエストトレース部107は、リクエストを一意に識別するリクエストIDを生成し、リクエストIDとリクエスト処理開始通知のイベントをリクエストトレーステーブル108に記録する(3)。
リクエストトレース部107は、以降、受信したリクエストに対するプログラムの処理において、端末10にレスポンスを送信するまで、同一のリクエストIDを用いてリクエストトレーステーブル108にイベントを記録する。
次に、リクエスト受付部101は、コンテナプログラム104を起動する(4)。コンテナプログラム104は、ユーザプログラム105を起動するための前処理を実行した後、リクエストトレース部107にユーザプログラムの開始を通知する(5)。
リクエストトレース部107は、リクエストIDとユーザプログラム開始通知のイベントをリクエストトレーステーブル108に記録する(6)。
ここまでの処理が、リクエスト開始処理である。続いて、ユーザプログラム処理(オブジェクト生成処理)が実行される。
その後、コンテナプログラム104は、ユーザプログラム105を実行する。
ユーザプログラム105は、業務処理を実行し、必要に応じて、オブジェクト管理部109にオブジェクトの生成を依頼する(7)。
オブジェクト管理部109は、オブジェクト生成処理をフックし(8)、オブジェクトID管理部110の処理を実行する。オブジェクト生成処理をフックするとは、オブジェクト管理部109に対するオブジェクト生成依頼を検知し、オブジェクト管理部109がオブジェクト生成処理を開始する前に、オブジェクトID管理部110の処理を実行させることである。そして、オブジェクトID管理部110の処理が完了すると、オブジェクト生成依頼をオブジェクト管理部109に到達させ、処理を続行させる。
オブジェクトID管理部110は、オブジェクトごとに一意の識別子をオブジェクトIDとして割り当てる。そして、オブジェクトID管理部110は、オブジェクトの生成をリクエストトレース部107に通知する(9)。
リクエストトレース部107は、リクエストIDとオブジェクト生成通知のイベントをリクエストトレーステーブル108に記録する(10)。
オブジェクトID管理部110は、その後、リクエストトレース部107からリクエストIDを取得し、生成したオブジェクトIDとともにオブジェクト管理テーブル112に記録する(11)。
この後、オブジェクト管理部109は、ユーザメモリ領域103にオブジェクト106の生成に必要なメモリ領域を確保してオブジェクト106を生成し(12)、ユーザプログラム105にオブジェクト106を送信する。
ここまでの処理が、ユーザプログラム処理(オブジェクト生成処理)である。続いて、リクエスト終了処理が実行される。
ユーザプログラム105は、オブジェクト106の使用を終了すると、オブジェクト106に対する参照を解放する。実行中のプログラム又はオブジェクトから参照されないオブジェクト106は、後述するオブジェクト解放処理によって、ユーザメモリ領域103から削除(解放)される。
ユーザプログラム105は、業務処理の実行が終了すると、コンテナプログラム104に制御を戻す。そして、コンテナプログラム104は、リクエストトレース部107にユーザプログラムの終了を通知する(14)。
リクエストトレース部107は、ユーザプログラム105の終了が通知されると、リクエストIDとユーザプログラム終了通知のイベントをリクエストトレーステーブル108に記録する(15)。
さらに、コンテナプログラム104は、ユーザプログラム105に対する後処理を実行した後、リクエスト受付部101に制御を戻し、処理を終了する(16)。その後、リクエスト受付部101は、リクエストトレース部107にリクエストの終了を通知する(17)。
リクエストトレース部107は、リクエストIDとリクエスト終了通知のイベントをリクエストトレーステーブル108に記録する(18)。この後、リクエスト受付部101は、端末10にレスポンスとしてユーザプログラム105の処理結果を送信する(19)。
ここまでに説明した手順では、生成されたオブジェクト106をユーザメモリ領域103から解放する処理は含まれていないが、ガーベジコレクションが実装されていないシステムなどでは、ユーザプログラム105からオブジェクト管理部109にメモリ解放処理を依頼する。
また、ガーベジコレクションが実装されるシステムでは、GC処理部111によって、リクエスト処理と独立してオブジェクト解放処理が定期的又は非定期的に実行される。この場合には、GC処理部111がオブジェクト管理部109にオブジェクト解放処理を依頼する。
ここで、オブジェクト解放時の処理について説明する。
図3Cは、本発明の実施の形態のオブジェクト解放時の処理の流れを示す説明図である。オブジェクトの解放処理は、リクエスト処理においてユーザプログラム105によって明示的に実行される場合と、GC処理部111によって、リクエスト処理と独立して所定のタイミングで実行される場合がある。
オブジェクト解放処理は、オブジェクト管理部109が依頼を受け付けて実行される(a)。このとき、オブジェクトID管理部110は、オブジェクト解放処理の依頼をフックして処理を実行する(b)。
ユーザプログラム105によって明示的にオブジェクト解放処理が実行される場合には、オブジェクトID管理部110は、リクエストトレース部107にオブジェクトの解放を通知する(c)。そして、リクエストトレース部107は、オブジェクト解放通知のイベントをリクエストトレーステーブル108に記録する(d)。
オブジェクトID管理部110は、解放済のオブジェクト106に対するオブジェクトIDをオブジェクト管理テーブル112から削除する(e)。その後、オブジェクト管理部109は、実際にオブジェクト106が使用していたユーザメモリ領域103に確保されたメモリ領域を解放する(f)。
続いて、端末10からリクエストを受け付けて、業務処理に必要なユーザプログラム105を実行し、オブジェクトが生成されてから解放されるまでの処理の詳細を、図4から図7に示すフローチャートを用いて説明する。
図4は、本発明の実施の形態のリクエスト処理時のオブジェクト管理処理の手順を示すフローチャートである。
リクエスト受付部101は、まず、端末10からネットワーク20を介して送信されたリクエストを受け付ける (S401)。リクエストは、ユーザによって依頼された業務処理の実行要求である。リクエスト受付部101は、リクエストを受け付けると、リクエストトレース部107にリクエストの処理開始を通知する。
リクエストトレース部107は、リクエストの処理開始が通知されると、リクエストを一意に識別可能なリクエストIDを生成する。そして、生成されたリクエストIDとリクエスト処理開始通知のイベントとをリクエストトレーステーブル108に記録する(S402)。具体的には、生成されたリクエストIDを“1”とすると、リクエストID201を“1”、イベント202を「リクエスト処理開始」として、リクエストトレーステーブル108に記録する(図2Aのレコード203)。
続いて、リクエスト受付部101は、コンテナプログラム104を実行する。コンテナプログラム104は、リクエストトレース部107にユーザプログラム105の処理開始を通知する。リクエストトレース部107は、ユーザプログラム105の処理開始が通知されると、ユーザプログラム処理開始通知のイベントを生成されたリクエストIDとともにリクエストトレーステーブル108に記録する(S403)。具体的には、実行されたユーザプログラムを「プログラム1」とすると、リクエストID201を“1”、イベント202を「プログラム1実行」として、リクエストトレーステーブル108に記録する(図2Aのレコード204)。
コンテナプログラム104は、ユーザプログラム105を実行する(S404)。ユーザプログラム105で実行される処理については、図5にて後述する。
コンテナプログラム104は、ユーザプログラム105の処理が完了すると、リクエストトレース部107にユーザプログラム105の処理終了を通知する。そして、リクエストトレース部107は、ユーザプログラム終了通知のイベントを前述のリクエストIDとともにリクエストトレーステーブル108に記録する(S405)。具体的には、リクエストID201を“1”、イベント202を「プログラム1実行終了」として、リクエストトレーステーブル108に記録する(図2Aのレコード207)。
その後、コンテナプログラム104の処理が完了すると、リクエスト受付部101に制御が戻される。そして、リクエスト受付部101は、リクエストトレース部107にリクエストの処理終了を通知する。リクエストトレース部107は、リクエストの処理が終了したことをリクエストIDとともにリクエストトレーステーブル108に記録する(S406)。具体的には、リクエストID201を“1”、イベント202を「リクエスト処理終了」として、リクエストトレーステーブル108に記録する(図2Aのレコード208)。
最後に、リクエスト受付部101は、ユーザプログラム105の実行結果をレスポンスとして端末10に送信する(S407)。
図5は、本発明の実施の形態のユーザプログラム処理の手順を示すフローチャートである。本フローチャートは、図4のフローチャートのS404の処理の詳細である。
ユーザプログラム105は、業務処理を実行する(S501)。そして、実行する処理に必要なオブジェクトを、必要となった時点で、オブジェクト管理部109にオブジェクトの生成を依頼する。
オブジェクト管理部109は、ユーザメモリ領域103にメモリ領域を確保し、オブジェクト106を生成する(S502)。そして、オブジェクト管理部109は、生成したオブジェクトをユーザプログラム105に送信する。
ユーザプログラム105は、生成されたオブジェクト106を用いて業務処理を継続する(S503)。ユーザプログラム105は、業務処理が完了し、オブジェクト106が不要になると、オブジェクト管理部109にオブジェクト106の解放を依頼する。
オブジェクト管理部109は、オブジェクト106の解放を依頼されると、オブジェクト106で使用したメモリ領域を解放する(S504)。このとき、ユーザプログラム105がS504のオブジェクト解放処理を実行しない場合には、メモリリークが発生してしまう。特に、ガーベジコレクションを備えない場合には、解放されないオブジェクト106は、ユーザメモリ領域103を占有し続けてしまうこととなる。
図6は、本発明の実施の形態のオブジェクト生成処理の手順を示すフローチャートである。本フローチャートは、図5のフローチャートのS502の処理の詳細である。
オブジェクト管理部109は、ユーザプログラム105からのオブジェクト106の生成を依頼されると、オブジェクト生成処理を開始する(S601)。このとき、オブジェクトID管理部110は、オブジェクト生成処理をフックして処理を実行する(S602)。
オブジェクトID管理部110は、生成されるオブジェクトを識別するオブジェクトIDを生成する(S603)。そして、オブジェクトの生成をリクエストトレース部107に通知する。
リクエストトレース部107は、オブジェクトの生成が通知されると、オブジェクト生成のイベントを生成されたオブジェクトのオブジェクトIDを明示して、リクエストIDとともにリクエストトレーステーブル108に記録する(S604)。具体的には、リクエストIDが“1”のリクエストがオブジェクトCを生成する場合には、リクエストID201を“1”、イベント202を「オブジェクトC生成」として、リクエストトレーステーブル108に記録する(図2Aのレコード205)。
オブジェクトID管理部110は、生成するオブジェクトのオブジェクトIDとリクエストトレース部107によって生成されたリクエストIDをオブジェクト管理テーブル112に記録する(S605)。具体的には、リクエストIDが“1”のリクエストがオブジェクトAを生成した場合、図2Bに示すように、オブジェクトID211を“A”、リクエストID212を“1”として、オブジェクト管理テーブル112に記録する(図2Bのレコード213)。
その後、オブジェクト管理部109は、ユーザメモリ領域103に領域を確保し、オブジェクト106を生成する(S606)。そして、生成されたオブジェクト106は、ユーザプログラム105に送信される(S607)。
図7は、本発明の実施の形態のオブジェクト解放処理の手順を示すフローチャートである。本フローチャートは、図5のフローチャートのS504の処理の詳細である。
オブジェクト管理部109は、ユーザプログラム105又はGC処理部111からの要求によって、オブジェクト解放処理を開始する(S701)。オブジェクトID管理部110は、オブジェクト解放処理をフックして、処理を実行する(S702)。
オブジェクト解放処理がユーザプログラム105から要求された場合には(S703の結果が「No」)、リクエスト処理でオブジェクト解放処理が実行されるため、オブジェクトID管理部110は、リクエストトレース部107にオブジェクトの解放を通知する。
リクエストトレース部107は、オブジェクトの解放が通知されると、オブジェクト解放のイベントを解放されたオブジェクトのオブジェクトIDを明示して、リクエストIDとともにリクエストトレーステーブル108に記録する(S704)。具体的には、リクエストIDが“1”のリクエストがオブジェクトCを解放する場合には、リクエストID201を“1”、イベント202を「オブジェクトC解放」として、リクエストトレーステーブル108に記録する(図2Aのレコード206)。
一方、オブジェクト解放処理がGC処理部111から要求された場合には(S703の結果が「Yes」)、オブジェクト解放処理はリクエスト処理に含まれないため、S704の処理は実行されない。
さらに、オブジェクトID管理部110は、解放されたオブジェクトのオブジェクトIDとリクエストIDの対応関係をオブジェクト管理テーブル112から削除する(S705)。さらに、オブジェクト管理部109は、オブジェクト106が使用していたメモリ領域を解放する(S706)。
リクエストトレーステーブル108に記録されたオブジェクトの生成及び解放のトレース情報は、メモリリークの疑いのあるオブジェクトを検出し、メモリリークの原因を究明するための情報として利用される。
続いて、リクエストトレーステーブル108及びオブジェクト管理テーブル112に記録された情報に基づいて、メモリリークの疑いのあるオブジェクトを検出する手順について説明する。
図8は、本発明の実施の形態のメモリリークの検出処理の流れの概要を示す説明図である。図8の矢印に付されている括弧付きの符号は、処理の順序を示す。メモリリークの検出処理は、アプリケーションサーバ30のUI113から、ユーザの指示を受け付けて実行される。なお、説明の文末に付されている括弧付きの符号は、図8の矢印に付されている括弧付きの符号に対応する。
UI113は、メモリリークの疑いのあるオブジェクト一覧(リークオブジェクト一覧118)の取得をメモリリーク解析部114に依頼する(1)。ここで、メモリリークの疑いのあるオブジェクトとは、オブジェクトを生成したリクエストが完了しているにもかかわらず、メモリから解放されていないオブジェクトのことである。
なお、ガーベジコレクションによってオブジェクトが解放される場合には、メモリリーク解析部114は、オブジェクトの解放をGC処理部111に依頼し、いずれのプログラム又はオブジェクトから参照されていないオブジェクトを解放する(2)。また、オブジェクトがユーザプログラム105によって明示的にメモリから解放される場合には、ガーベジコレクションによるオブジェクト解放処理を実行しなくてもよい。
GC処理部111によるオブジェクトの解放が完了すると、メモリリーク解析部114は、実行中リクエスト解析部115に依頼し、実行中リクエスト一覧117を取得する(3)。実行中リクエスト一覧117とは、リクエストトレーステーブル108にリクエストの完了情報が記録されておらず、かつ、処理が完了していないリクエストの一覧である。実行中リクエスト一覧117を必要とする理由は、メモリリークの疑いのあるオブジェクトを検出する時点で、処理中のリクエストが生成したオブジェクトをリーク候補のオブジェクト一覧から除外する必要があるためである。実行中リクエスト解析部115は、リクエストトレーステーブル108を参照し(4)、実行中リクエスト一覧117を作成する。
さらに、メモリリーク解析部114は、実行中リクエスト解析部115が生成した実行中リクエスト一覧117をリークオブジェクト解析部116に送信し、リークオブジェクト一覧118の取得を依頼する(5)。
リークオブジェクト解析部116は、オブジェクトとリクエストを対応付けているオブジェクト管理テーブルを参照し、実行中リクエスト一覧117に含まれていないリクエストと対応付けられているオブジェクトを検索し、リークオブジェクト一覧118を作成する(6)。
なお、オブジェクトにリクエストIDが記録されている場合には、リークオブジェクト解析部116は、ユーザメモリ領域103に存在するオブジェクトを検索することによって、リークオブジェクト一覧118を作成する。具体的には、ユーザメモリ領域103に存在するオブジェクトに記録されているリクエストIDと、実行中リクエスト一覧117に含まれるリクエストIDとが一致しないオブジェクトを抽出する。
メモリリーク解析部114は、リークオブジェクト解析部116によって生成されたリークオブジェクト一覧118をUI113に送信する。UI113は、リークオブジェクト一覧118に基づいて、画面上にメモリリークの疑いのあるオブジェクトの一覧を表示する。
図9Aは、本発明の実施の形態の実行中リクエスト解析部115によって生成される実行中リクエスト一覧117の一例を示す図である。
実行中リクエスト一覧117は、メモリリークの疑いのあるオブジェクトを検出する時点で実行中であるリクエストを一意に識別するリクエストID221の一覧を格納するテーブルである。
図9Aを参照すると、リクエストIDが“2”であるリクエストが実行中であるため、実行中リクエスト一覧117にリクエストID“2”が格納されている。
図9Bは、本発明の実施の形態のリークオブジェクト解析部116が生成するリークオブジェクト一覧118の一例を示す図である。
リークオブジェクト一覧118は、メモリリークの疑いがあるオブジェクトを一意に識別するオブジェクトID231と、当該オブジェクトを生成したリクエストを一意に識別するリクエストID232の一覧を格納するテーブルである。
図9Bを参照すると、オブジェクトID231が“A”及び“B”であるオブジェクトがメモリリークの疑いがあり、これらのオブジェクトは、リクエストID232が“1”であるリクエストによって生成されたことがわかる。
図10は、本発明の実施の形態のメモリリーク検出プログラムのGUIの構成の一例を説明する図である。
画面300は、ユーザからメモリリーク検出の指示を受け付ける画面である。画面300は、メモリリーク検出の指示を受け付ける旨のメッセージ310と、メモリリーク検出を指示するボタン311とを含む。
メモリリーク検出を指示するボタン311を操作することによってメモリリーク検出が指示されると、UI113は、前述のように、リークオブジェクト一覧118の取得をメモリリーク解析部114に依頼する。UI113は、メモリリーク解析部114からリークオブジェクト一覧118を取得すると、その内容を画面301に表示する。
画面301は、メモリリークの疑いのあるオブジェクト一覧を表示する画面であり、リークの疑いのあるオブジェクト名及び個数の一覧を表示するテーブル312を表示する。テーブル312は、オブジェクトを選択するためのラジオボタンが配置されている。ラジオボタンを選択し、詳細表示ボタン313を操作することによって、選択されたオブジェクトを生成したリクエストの一覧を表示することができる。
画面302は、画面301で選択されたオブジェクトを生成したリクエストIDの一覧を表示する。選択されたオブジェクトを生成したリクエストIDの一覧は、テーブル314によって表示される。テーブル314には、リクエストIDを選択するためのラジオボタンが配置されている。テーブル314に配置されたラジオボタンを選択し、トレース表示ボタン315を操作すると、選択されたリクエストIDによって識別されるリクエストのトレース情報を表示することができる。
画面303は、画面302のラジオボタンで選択されたリクエストIDによって識別されるリクエストのトレース情報316を表示する。トレース情報316には、リクエスト処理開始及び終了、ユーザプログラム105の実行、オブジェクトの生成などが時系列順に表示される。
図11は、本発明の実施の形態のメモリリーク検出処理の手順を示すフローチャートである。本フローチャートは、UI113からの指示を受け付けて、メモリリークの疑いのあるオブジェクトの一覧を生成し、メモリリークの疑いのあるオブジェクトを生成したリクエストのトレース情報を表示するまでの処理内容を示している。また、図2A及び図2Bに示されたリクエストトレーステーブル108及びオブジェクト管理テーブル112を用いて、具体例を説明する。なお、メモリリーク検出処理は、リクエストIDが“1”であるリクエストが終了した後に(図2Aのレコード206)、実行されたものとする。
UI113は、ユーザが画面300のメモリリーク検出ボタン311を操作することによって、メモリリーク解析部114にリークオブジェクト一覧118の生成を依頼する(S801)。
メモリリーク解析部114は、ユーザプログラム105によって明示的にオブジェクトが解放されるか否かを判定する(S802A)。明示的にオブジェクトが解放されるシステムでない場合には(S802Aの結果が「No」)、GC処理部111にフルガーベジコレクションの実行を依頼し、別のオブジェクトから参照されていないオブジェクトを解放する(S802B)。また、ユーザプログラム105によって明示的にオブジェクトが解放される場合には(S802Aの結果が「Yes」)、オブジェクト解放処理を実行せずにS803の処理を実行してもよい。
メモリリーク解析部114は、実行中リクエスト解析部115に、実行中リクエストの解析を依頼する。実行中リクエスト解析部115は、リクエストトレーステーブル108を参照し、リクエスト処理終了のトレースが記録されていない実行中リクエスト一覧117を生成する(S803)。
ここで、図2Aのリクエストトレーステーブル108を参照すると、前述のように、リクエストIDが“1”のリクエスト終了後に本処理が実行されているため、リクエスト処理が終了していない実行中リクエストは、リクエストIDが“2”のリクエストとなる。したがって、図9Aに示すように、実行中リクエスト一覧117には、リクエストID221に“2”が格納されたレコード222が含まれている。
メモリリーク解析部114は、S803の処理によって実行中リクエスト解析部115によって取得された実行中リクエスト一覧117をリークオブジェクト解析部116に送信する。リークオブジェクト解析部116は、オブジェクト管理テーブル112から現在実行中ではない(すなわち、すでに処理を完了している)リクエストによって生成されたオブジェクトの一覧(リークオブジェクト一覧118)を生成する(S804)。
図9Bのリークオブジェクト一覧118を生成する手順を具体的に説明すると、リークオブジェクト解析部116は、まず、実行中リクエスト一覧117を参照し、実行中のリクエストのリクエストIDを特定する。図9Aを参照すると、リクエストID221に“2”が格納されている。続いて、図2Bのオブジェクト管理テーブル112から、実行中リクエスト一覧117に含まれていないリクエストによって生成されたオブジェクト、すなわち、処理が完了したリクエストによって生成されたオブジェクトを抽出する。したがって、リクエストIDが“2”以外のリクエスト、すなわち、リクエストIDが“1”のリクエストによって生成されたオブジェクト“A”及び“B”が、図2Bのオブジェクト管理テーブル112から抽出され、リークオブジェクト一覧118が生成される。
生成されたリークオブジェクト一覧118は、UI113(図10の画面301のオブジェクト一覧312)に表示される(S805)。
続いて、ユーザは、画面301の詳細表示ボタン313を操作することによって、UI113に表示したメモリリークの疑いのあるオブジェクト一覧から、さらに詳細を調査するオブジェクトを選択する(S806)。
メモリリーク解析部114は、選択された調査対象のオブジェクトを生成したすべてのリクエストを、S804の処理によって生成されたリークオブジェクト一覧118から検索する(S807)。そして、検索されたリクエストは、UI113(図10の画面302のリクエスト一覧314)に表示される(S808)。
画面302を参照すると、オブジェクト“A”が選択されている。オブジェクト“A”は、図9Bのリークオブジェクト一覧118を参照すると、リクエストIDが“1”のリクエストによって生成されたことがわかる。
さらに、ユーザは、画面302に表示されたリクエスト一覧314から、詳細なトレース情報を表示するリクエストを選択し、トレース表示ボタン315を操作する(S809)。そして、メモリリーク解析部114は、選択されたリクエストのトレース情報をリクエストトレーステーブル108から検索する(S810)。最後に、検索されたリクエストのトレース情報を、UI113(図10の画面303)に時系列順に表示する(S811)。図10の画面303には、リクエストIDが“1”のリクエストのトレース情報が表示されている。
リクエストトレーステーブル108は、すべてのリクエストのトレース情報が記録される。そのため、リクエストトレーステーブル108に含まれるトレース情報の数は、時間が経過するにしたがって増加し続けることとなる。したがって、リクエストトレーステーブル108から、不要なリクエストのトレース情報を削除する必要がある。
図12は、本発明の実施の形態のリクエストトレーステーブル108に格納されたトレース情報を削除する手順を示すフローチャートである。なお、トレース情報の削除処理は、一定時間ごとに実行してもよいし、リクエストトレーステーブル108に格納されたトレース情報のレコード数が、閾値を超えた場合に実行してもよい。
削除されるトレース情報は、完了済のリクエストであって、かつ、当該リクエストによって生成されたオブジェクトがメモリリークを発生させていないリクエストに関するトレース情報であって、オブジェクトの生成又は解放について記録されたレコードとする。
リクエストトレース部107は、まず、リクエストトレーステーブル108から、リクエスト完了のトレース情報が記録されているすべてのリクエストを検索する(S901)。
さらに、リクエストトレース部107は、S901の処理で取得されたリクエストを当該リクエストによって生成され、かつ、すべてのオブジェクトが解放済であるリクエストに絞り込む(S902)。なお、リクエストによって生成されたオブジェクトが解放済であるか否かは、オブジェクト管理テーブル112に当該リクエストによって生成されたオブジェクトが登録されていないことを確認することによって判定する。
最後に、リクエストトレース部107は、S902の処理で絞り込まれたリクエストのリクエストIDを有し、オブジェクトの生成又は開放が記録されたトレース情報を、リクエストトレーステーブル108から削除する(S903)。
以上の処理によって、メモリリークが発生していないリクエストについて、プログラムの実行などの通常のトレース情報以外の、オブジェクトの生成又は解放が記録されたレコードがリクエストトレーステーブル108から削除される。オブジェクトの生成又は解放が記録されたレコードは、メモリリークの検出及び発生要因をするために記録されるため、メモリリークを発生させずに正常に処理が完了したリクエストでは不要となる。そこで、所定のタイミングで、オブジェクトの生成又は解放が記録されたレコードを削除することによって、トレース情報を記憶するための容量を削減することができる。
本発明の実施の形態によれば、ユーザから受け付けたリクエストを処理するとき、リクエストの受け付けから終了までに発生したイベントの履歴(トレース情報)をリクエストトレーステーブル108に記録する。また、受け付けたリクエストを処理するために生成されたオブジェクトをリクエストと対応付けてオブジェクト管理テーブル112に記録する。そして、リクエストトレーステーブル108及びオブジェクト管理テーブル112に格納された情報に基づいて、メモリリークの疑いのあるオブジェクトを抽出することが可能となる。
さらに、本発明の実施の形態によれば、リクエストトレーステーブル108にトレース情報が記録されているため、メモリリークが発生したオブジェクトを生成するタイミング及び前後の処理を特定することができる。したがって、メモリリークが発生する条件を容易に特定することができる。
本発明の実施の形態の装置構成を示す説明図である。 本発明の実施の形態のリクエストトレーステーブルの一例を示す説明図である。 本発明の実施の形態のオブジェクト管理テーブルの一例を示す説明図である。 本発明の実施の形態のリクエスト処理時のオブジェクト管理の処理の流れを示す説明図である。 本発明の実施の形態のリクエスト処理時のオブジェクト生成時の処理の流れを示す説明図である。 本発明の実施の形態のオブジェクト解放時の処理の流れを示す説明図である。 本発明の実施の形態のリクエスト処理時のオブジェクト管理処理のフローチャートである。 本発明の実施の形態のユーザプログラムの処理手順を示すフローチャートである。 本発明の実施の形態のオブジェクト生成処理の手順を示すフローチャートである。 本発明の実施の形態のオブジェクト解放処理の手順を示すフローチャートである。 本発明の実施の形態のメモリリークの検出処理の流れを示す説明図である。 本発明の実施の形態の実行中リクエスト一覧の一例を示す図である。 本発明の実施の形態のリークオブジェクト一覧の一例を示す説明図である。 本発明の実施の形態のメモリリーク検出処理の画面の一例を示す説明図である。 本発明の実施の形態のメモリリーク検出処理の手順を示すフローチャートである。 本発明の実施の形態のリクエストトレーステーブルに格納されたトレース情報を削除する手順を示すフローチャートである。
符号の説明
10 端末
20 ネットワーク
30 アプリケーション(AP)サーバ
40 メモリ領域
101 リクエスト受付部
102 プログラム群
103 ユーザメモリ領域
104 コンテナプログラム
105 ユーザプログラム
106 オブジェクト
107 リクエストトレース部
108 リクエストトレーステーブル
109 オブジェクト管理部
110 オブジェクトID管理部
111 GC処理部
112 オブジェクト管理テーブル
113 UI(GUI、CUI)
114 メモリリーク解析部
115 実行中リクエスト解析部
116 リークオブジェクト解析部
300 メモリリーク検出プログラム初期画面
301 メモリリークの疑いのあるオブジェクト一覧表示画面
302 オブジェクトを生成したリクエスト一覧表示画面
303 リクエストのトレース情報画面

Claims (12)

  1. アプリケーションサーバにおいて、受け付けたリクエストに基づいて実行された処理のメモリリークを検出する方法であって、
    前記アプリケーションサーバは、インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、プログラム及びデータを格納する記憶装置と、を備え、
    前記プロセッサは、
    前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録し、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録し、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除し、前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録し、
    前記アプリケーションサーバが、メモリリークを検出する指示を受け付けたとき、
    前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、
    前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する、ことを特徴とするメモリリーク検出方法。
  2. 前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報は、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを管理するオブジェクト管理情報に記録される、ことを特徴とする請求項1に記載のメモリリーク検出方法。
  3. 前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報は、前記受け付けたリクエストの処理の過程で生成されるオブジェクトに記録される、ことを特徴とする請求項1に記載のメモリリーク検出方法。
  4. 前記プロセッサは、前記検出されたメモリリークの疑いのあるオブジェクトの一覧を表示する、ことを特徴とする請求項1に記載のメモリリーク検出方法。
  5. 前記プロセッサは、
    前記検出されたメモリリークの疑いのあるオブジェクトの選択を受け付け、
    前記選択されたメモリリークの疑いのあるオブジェクトを生成したリクエストの一覧を表示する、ことを特徴とする請求項4に記載のメモリリーク検出方法。
  6. 前記プロセッサは、
    前記選択されたオブジェクトを生成したリクエストの選択を受け付け、
    前記選択されたリクエストの履歴を、前記リクエストトレース情報から抽出し、
    前記抽出されたリクエストの履歴を時系列順で表示する、ことを特徴とする請求項5に記載のメモリリーク検出方法。
  7. 前記プロセッサは、前記メモリリークを検出する指示を受け付けた後、前記メモリリークの疑いのあるオブジェクトを検出する前に、他のオブジェクトから参照されていないオブジェクトを解放する処理を実行する、ことを特徴とする請求項1に記載のメモリリーク検出方法。
  8. 前記プロセッサは、所定のタイミングで、
    終了履歴が記録されたリクエストを、前記リクエストトレース情報から検索し、
    処理が終了したリクエストとして検索されたリクエストであって、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に対応するオブジェクトが記録されていないリクエストを抽出し、
    前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項1に記載のメモリリーク検出方法。
  9. 前記プロセッサは、周期的に、前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項8に記載のメモリリーク検出方法。
  10. 前記プロセッサは、前記リクエストトレース情報として記録されたトレース情報の量が所定の値を超えたとき、前記抽出されたリクエストによって実行された処理のトレース情報であって、オブジェクトの生成又は開放が記録されたトレース情報を前記リクエストトレース情報から削除する、ことを特徴とする請求項8に記載のメモリリーク検出方法。
  11. 実行された処理のメモリリークを検出するメモリリーク検出装置であって、
    インターフェースと、前記インターフェースに接続されるプロセッサと、前記プロセッサによってアクセス可能なメモリと、プログラム及びデータを格納する記憶装置と、を備え、
    業務処理を含んだリクエストを受け付けるリクエスト受付部と、
    前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成、及び、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したときに前記使用を終了したオブジェクトの開放をリクエストトレース情報として記録するリクエストトレース部と、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、前記受け付けたリクエストを特定する識別子と、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを特定する識別子と、の対応情報を記録し、前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除するオブジェクト管理部と、
    メモリリークを検出する指示を受け付けたとき、前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得し、前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出するメモリリーク解析部と、を備えることを特徴とするメモリリーク検出装置。
  12. 受け付けたリクエストに基づいて処理を実行する計算機において、前記受け付けたリクエストに基づいて実行された処理のメモリリークを検出するプログラムであって、
    前記受け付けたリクエストを特定する識別子と対応付けて、前記受け付けたリクエストに基づいて実行された処理の履歴をリクエストトレース情報として記録する手順と、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトを生成するとき、
    前記受け付けたリクエストを特定する識別子と、前記受け付けたリクエストの処理の過程で生成されるオブジェクトを特定する識別子と、の対応情報を記録する手順と、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトの生成を前記リクエストトレース情報に記録する手順と、
    前記受け付けたリクエストの処理の過程で生成されるオブジェクトの使用を終了したとき、
    前記受け付けたリクエストと前記使用を終了したオブジェクトとの対応情報を削除する手順と、
    前記使用を終了したオブジェクトの開放を前記リクエストトレース情報に記録する手順と、
    前記計算機が、メモリリークを検出する指示を受け付けたとき、
    前記リクエストトレース情報に終了履歴が記録されていないリクエストを検索することによって、実行中のリクエストの一覧を取得する手順と、
    前記取得された実行中のリクエスト一覧に含まれず、かつ、前記受け付けたリクエストと前記受け付けたリクエストの処理の過程で生成されるオブジェクトとの対応情報に含まれる、リクエストに対応するオブジェクトを、メモリリークの疑いのあるオブジェクトとして検出する手順と、を計算機に実行させることを特徴とするメモリリーク検出プログラム。
JP2006318800A 2006-11-27 2006-11-27 メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム Expired - Fee Related JP4847300B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2006318800A JP4847300B2 (ja) 2006-11-27 2006-11-27 メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム
US11/851,723 US20080127212A1 (en) 2006-11-27 2007-09-07 Memory leak detecting method, memory leak detecting device and memory leak detecting program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006318800A JP4847300B2 (ja) 2006-11-27 2006-11-27 メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム

Publications (2)

Publication Number Publication Date
JP2008134709A true JP2008134709A (ja) 2008-06-12
JP4847300B2 JP4847300B2 (ja) 2011-12-28

Family

ID=39465441

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006318800A Expired - Fee Related JP4847300B2 (ja) 2006-11-27 2006-11-27 メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム

Country Status (2)

Country Link
US (1) US20080127212A1 (ja)
JP (1) JP4847300B2 (ja)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100936967B1 (ko) 2009-08-04 2010-01-14 주식회사 엑셈 웹 어플리케이션 서버 운영 하에서 사용자 프로그램의 메모리 누수 추적 장치 및 그 방법
JP2010204955A (ja) * 2009-03-03 2010-09-16 Internatl Business Mach Corp <Ibm> プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
US8566802B2 (en) 2009-05-29 2013-10-22 International Business Machines Corporation Method of ascertaining primary cause of memory consumption in program, and computer system and computer program for the same
JP2016018470A (ja) * 2014-07-10 2016-02-01 富士通株式会社 情報処理装置,情報処理方法及び情報処理プログラム
US10204000B2 (en) 2015-05-01 2019-02-12 Fujitsu Limited Apparatus and method for managing dump data for cause analysis of a memory leak
CN117149477A (zh) * 2023-02-08 2023-12-01 荣耀终端有限公司 内存泄露检测方法和装置

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080028302A1 (en) * 2006-07-31 2008-01-31 Steffen Meschkat Method and apparatus for incrementally updating a web page
US8762783B2 (en) * 2010-06-24 2014-06-24 International Business Machines Corporation Error identification
US8996985B1 (en) 2011-03-16 2015-03-31 Google Inc. Online document processing service for displaying comments
US20150199308A1 (en) 2011-10-17 2015-07-16 Google Inc. Systems and methods for controlling the display of online documents
US8812946B1 (en) 2011-10-17 2014-08-19 Google Inc. Systems and methods for rendering documents
US8266245B1 (en) 2011-10-17 2012-09-11 Google Inc. Systems and methods for incremental loading of collaboratively generated presentations
US8471871B1 (en) 2011-10-17 2013-06-25 Google Inc. Authoritative text size measuring
US10430388B1 (en) 2011-10-17 2019-10-01 Google Llc Systems and methods for incremental loading of collaboratively generated presentations
US8751546B1 (en) * 2012-01-06 2014-06-10 Google Inc. Systems and methods for minimizing the effects of garbage collection
US9367522B2 (en) 2012-04-13 2016-06-14 Google Inc. Time-based presentation editing
US9529785B2 (en) 2012-11-27 2016-12-27 Google Inc. Detecting relationships between edits and acting on a subset of edits
US9164872B2 (en) * 2013-05-22 2015-10-20 Sap Se Tracking of program objects during request processing
US9971752B2 (en) 2013-08-19 2018-05-15 Google Llc Systems and methods for resolving privileged edits within suggested edits
US9348803B2 (en) 2013-10-22 2016-05-24 Google Inc. Systems and methods for providing just-in-time preview of suggestion resolutions
CN116069532A (zh) * 2021-10-29 2023-05-05 戴尔产品有限公司 使用对异常内存使用模式的基于规则的检测来识别和补救内存泄漏

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10254728A (ja) * 1997-03-06 1998-09-25 Mitsubishi Electric Corp デバッグシステム
JPH11203193A (ja) * 1998-01-14 1999-07-30 Hitachi Ltd 共有メモリ管理装置及び方法
JP2000003303A (ja) * 1998-06-16 2000-01-07 Nippon Signal Co Ltd:The 情報処理装置、情報処理方法、記憶媒体
JP2002055852A (ja) * 2000-08-07 2002-02-20 Nec Corp オブジェクトの生成・消滅情報管理方式
JP2002189596A (ja) * 2000-12-20 2002-07-05 Ricoh Co Ltd データ処理装置
JP2005108235A (ja) * 2003-09-30 2005-04-21 Internatl Business Mach Corp <Ibm> 自律的(autonomic)メモリ・リーク検出および修復

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10254728A (ja) * 1997-03-06 1998-09-25 Mitsubishi Electric Corp デバッグシステム
JPH11203193A (ja) * 1998-01-14 1999-07-30 Hitachi Ltd 共有メモリ管理装置及び方法
JP2000003303A (ja) * 1998-06-16 2000-01-07 Nippon Signal Co Ltd:The 情報処理装置、情報処理方法、記憶媒体
JP2002055852A (ja) * 2000-08-07 2002-02-20 Nec Corp オブジェクトの生成・消滅情報管理方式
JP2002189596A (ja) * 2000-12-20 2002-07-05 Ricoh Co Ltd データ処理装置
JP2005108235A (ja) * 2003-09-30 2005-04-21 Internatl Business Mach Corp <Ibm> 自律的(autonomic)メモリ・リーク検出および修復

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010204955A (ja) * 2009-03-03 2010-09-16 Internatl Business Mach Corp <Ibm> プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
US8555255B2 (en) 2009-03-03 2013-10-08 International Business Machines Corporation Method of tracing object allocation site in program, as well as computer system and computer program therefor
US8782610B2 (en) 2009-03-03 2014-07-15 International Business Machines Corporation Method of tracing object allocation site in program, as well as computer system and computer program therefor
US8566802B2 (en) 2009-05-29 2013-10-22 International Business Machines Corporation Method of ascertaining primary cause of memory consumption in program, and computer system and computer program for the same
US9798651B2 (en) 2009-05-29 2017-10-24 International Business Machines Corporation Method of ascertaining primary cause of memory consumption in program, and computer system and computer program for the same
US10031840B2 (en) 2009-05-29 2018-07-24 International Business Machines Corporation Method of ascertaining primary cause of memory consumption in program, and computer system and computer program for the same
KR100936967B1 (ko) 2009-08-04 2010-01-14 주식회사 엑셈 웹 어플리케이션 서버 운영 하에서 사용자 프로그램의 메모리 누수 추적 장치 및 그 방법
JP2016018470A (ja) * 2014-07-10 2016-02-01 富士通株式会社 情報処理装置,情報処理方法及び情報処理プログラム
US10204000B2 (en) 2015-05-01 2019-02-12 Fujitsu Limited Apparatus and method for managing dump data for cause analysis of a memory leak
CN117149477A (zh) * 2023-02-08 2023-12-01 荣耀终端有限公司 内存泄露检测方法和装置

Also Published As

Publication number Publication date
JP4847300B2 (ja) 2011-12-28
US20080127212A1 (en) 2008-05-29

Similar Documents

Publication Publication Date Title
JP4847300B2 (ja) メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム
US8489941B2 (en) Automatic documentation of ticket execution
JP2011028737A (ja) フォーム操作のためにスクリーン・キャプチャ機能を強化する方法およびコンピュータ・プログラム
SG182486A1 (en) Method, system and server for collecting version of software
JP2006276926A (ja) データの再配置方法
KR101748833B1 (ko) 소프트웨어 고장의 위치 확정 방법, 장치 및 설비
JP2006231040A (ja) 画像診断装置、医用システムおよびプロトコル管理方法
JP2008210150A (ja) 画面保存システム
US20120041946A1 (en) Data search apparatus, control method thereof and computer readable storage medium
CN106980572B (zh) 分布式***的在线调试方法和***
JP5294002B2 (ja) 文書管理システム、文書管理プログラム及び文書管理方法
JP2007128450A (ja) ソフトウェア再利用部品管理システム
US20220164703A1 (en) Model acceptance determination support system and model acceptance determination support method
JP5758544B2 (ja) 画面情報収集計算機、画面情報収集方法及び計算機読み取り可能な記憶媒体
JP6075013B2 (ja) ログ取得プログラム、ログ取得装置及びログ取得方法
JP2008182650A (ja) 画像形成装置及びプログラム
JP6340990B2 (ja) メッセージ表示方法、メッセージ表示装置、およびメッセージ表示プログラム
US11354081B2 (en) Information processing apparatus with concealed information
JP2009134535A (ja) ソフトウェア開発支援装置、ソフトウェア開発支援方法及びソフトウェア開発支援プログラム
JP2004178340A (ja) 返答取得支援プログラムおよび返答取得支援方法
US20210149721A1 (en) Information processing system, information processing apparatus, and non-transitory computer readable medium storing program
JPH11328193A (ja) 情報検索システム及び記録媒体
JP2011118575A (ja) 障害対策情報取得方法および管理サーバ
JP2005267540A (ja) ファイル検索装置およびファイル検索方法およびファイル検索プログラム
JP2017220086A (ja) 障害情報収集システム、情報処理装置、障害情報収集装置、及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20081219

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20101115

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110802

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110922

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20111011

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20111013

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20141021

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees