WO2011104889A1 - 計算機システム、メモリ管理方法及びメモリ管理プログラム - Google Patents
計算機システム、メモリ管理方法及びメモリ管理プログラム Download PDFInfo
- Publication number
- WO2011104889A1 WO2011104889A1 PCT/JP2010/053477 JP2010053477W WO2011104889A1 WO 2011104889 A1 WO2011104889 A1 WO 2011104889A1 JP 2010053477 W JP2010053477 W JP 2010053477W WO 2011104889 A1 WO2011104889 A1 WO 2011104889A1
- Authority
- WO
- WIPO (PCT)
- Prior art keywords
- area
- computer system
- memory management
- processor
- class
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
Abstract
プログラムを実行するプロセッサと、メモリと、を備えた計算機システムであって、前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備え、前記プロセッサは、前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納し、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を複数回取得し、それら取得された前記参照関係を示す情報を組み合わせた情報に基づいて、前記第2の領域に移動すべき起点となるオブジェクトを検出し、検出された前記起点となるオブジェクトを前記第2の領域に移動させることを特徴とする計算機システム。
Description
本発明は、計算機システムに関し、特に、Java技術を基盤とし、内部ヒープ領域以外の記憶領域を利用する計算機システムに関する。
近年、Java(登録商標)技術を基盤としたシステム(例えば金融系システム、基幹系システム)が多く現れている。Java技術を基盤としたシステムでは、確保されたメモリ領域のうちの不要になった領域の解放は、Java仮想マシン(以下、「JavaVM」という。)に実装されたガベージコレクタによって自動的に実行される。このように、コンピュータプログラムによって不良を起こしやすいメモリ領域の解放処理を自動化することによって、複数人によるプログラム開発やプログラムの肥大化への対応が容易になっている。
このようなメモリ領域の解放処理(ガベージコレクション、以下、「GC(Garbage Collection)」という。)が実行されるのは、Javaヒープメモリの使用量が所定の閾値を超える直前である。Javaヒープメモリとは、Javaプログラムによって生成されたデータ(Javaオブジェクト等)を格納するメモリ領域である。なお、GCが起動した場合、Javaプログラムによって実行中の全てのスレッドが中断し、数ミリ秒から数十秒の間、業務プログラムが停止する。
このようなGCのアルゴリズムとして、世代別GCが多く採用されている。世代別GCは、停止時間が短時間のCopyGCと、停止時間が長時間のFullGCの2種類のGCが使い分けるものである。CopyGCは、Javaヒープメモリが備えるNew領域とOLD領域のうちのNew領域についてのみGCを実行する。一方、FullGCは、New領域とOld領域の両方についてGCを実行する。世代別GCは、状況に応じてCopyGCとFullGCとを使い分けることによって、GCに伴う停止時間を少なくしている。しかしながら、停止時間が長時間のFullGCの発生は避けられず、ミッションクリティカルの分野での懸念事項である。
通常、JavaVMは、自身が管理するヒープメモリ領域(以下、「内部ヒープ領域」という。)にJavaオブジェクトを生成する。ガベージコレクタは、内部ヒープ領域に格納されたデータを解放する。
特許文献1には、内部ヒープ領域以外のメモリ領域を利用することによって、GCに伴う停止時間を短縮する技術が開示されている。特許文献1に記載の技術によれば、GCの対象外のヒープメモリ領域(以下、「外部ヒープ領域」という。)を設け、内部ヒープ領域に生成されたオブジェクトのうち、メモリリークの原因である可能性が高いオブジェクトを、この外部ヒープ領域に移動させている。外部ヒープ領域に移動されたオブジェクトは、それ自身が不要になった時点で、ソースコード中に記載された命令により外部ヒープ領域と共に解放される。すなわち、HTTPセッションのような比較的長命(長寿命)のオブジェクトを外部ヒープ領域に移動させることにより、内部ヒープ領域の使用量の増加を抑えてGCの発生頻度を抑えることができる。このように、明示的に外部ヒープ領域にオブジェクトを生成及び解放する方法を、「明示メモリ管理方式」という。
しかしながら、この明示メモリ管理方式では、予めソースコード中に、外部ヒープ領域に生成されたオブジェクトを指定する命令及び解放する命令を明記する必要がある。そのため、既存の又は複雑化したソースコードを有するプログラムへの適用が困難である。そこで、明示メモリ管理方式において、外部ヒープ領域に生成されたオブジェクトを自動的に指定する方法が考案されている(特許文献2参照)。
特許文献2には、外部ヒープ領域を動的に解放する技術が開示されている。特許文献2に記載の技術によれば、GCを実行する際に、外部ヒープ領域に格納されたオブジェクトの参照関係を調査する。調査の結果、このオブジェクトが外部ヒープ領域以外から参照されていない場合は、外部ヒープ領域ごと解放する。これにより、予めソースコード中に、外部ヒープ領域に生成されたオブジェクトを解放する命令を明記することなく、安全にメモリ領域を解放できる。
このようなメモリ領域の解放処理(ガベージコレクション、以下、「GC(Garbage Collection)」という。)が実行されるのは、Javaヒープメモリの使用量が所定の閾値を超える直前である。Javaヒープメモリとは、Javaプログラムによって生成されたデータ(Javaオブジェクト等)を格納するメモリ領域である。なお、GCが起動した場合、Javaプログラムによって実行中の全てのスレッドが中断し、数ミリ秒から数十秒の間、業務プログラムが停止する。
このようなGCのアルゴリズムとして、世代別GCが多く採用されている。世代別GCは、停止時間が短時間のCopyGCと、停止時間が長時間のFullGCの2種類のGCが使い分けるものである。CopyGCは、Javaヒープメモリが備えるNew領域とOLD領域のうちのNew領域についてのみGCを実行する。一方、FullGCは、New領域とOld領域の両方についてGCを実行する。世代別GCは、状況に応じてCopyGCとFullGCとを使い分けることによって、GCに伴う停止時間を少なくしている。しかしながら、停止時間が長時間のFullGCの発生は避けられず、ミッションクリティカルの分野での懸念事項である。
通常、JavaVMは、自身が管理するヒープメモリ領域(以下、「内部ヒープ領域」という。)にJavaオブジェクトを生成する。ガベージコレクタは、内部ヒープ領域に格納されたデータを解放する。
特許文献1には、内部ヒープ領域以外のメモリ領域を利用することによって、GCに伴う停止時間を短縮する技術が開示されている。特許文献1に記載の技術によれば、GCの対象外のヒープメモリ領域(以下、「外部ヒープ領域」という。)を設け、内部ヒープ領域に生成されたオブジェクトのうち、メモリリークの原因である可能性が高いオブジェクトを、この外部ヒープ領域に移動させている。外部ヒープ領域に移動されたオブジェクトは、それ自身が不要になった時点で、ソースコード中に記載された命令により外部ヒープ領域と共に解放される。すなわち、HTTPセッションのような比較的長命(長寿命)のオブジェクトを外部ヒープ領域に移動させることにより、内部ヒープ領域の使用量の増加を抑えてGCの発生頻度を抑えることができる。このように、明示的に外部ヒープ領域にオブジェクトを生成及び解放する方法を、「明示メモリ管理方式」という。
しかしながら、この明示メモリ管理方式では、予めソースコード中に、外部ヒープ領域に生成されたオブジェクトを指定する命令及び解放する命令を明記する必要がある。そのため、既存の又は複雑化したソースコードを有するプログラムへの適用が困難である。そこで、明示メモリ管理方式において、外部ヒープ領域に生成されたオブジェクトを自動的に指定する方法が考案されている(特許文献2参照)。
特許文献2には、外部ヒープ領域を動的に解放する技術が開示されている。特許文献2に記載の技術によれば、GCを実行する際に、外部ヒープ領域に格納されたオブジェクトの参照関係を調査する。調査の結果、このオブジェクトが外部ヒープ領域以外から参照されていない場合は、外部ヒープ領域ごと解放する。これにより、予めソースコード中に、外部ヒープ領域に生成されたオブジェクトを解放する命令を明記することなく、安全にメモリ領域を解放できる。
このように、特許文献1、2に開示された技術では、内部ヒープ領域以外の外部ヒープ領域を利用することによって、GCに伴う停止時間の短縮を図っている。しかしながら、内部ヒープ領域に生成されたオブジェクトのうち、どのオブジェクトを外部ヒープ領域に移動すべきかについては考慮されていなかった。そのため、外部ヒープ領域を効率的に利用できない問題があった。
本発明は、上述した問題を考慮したものであって、外部ヒープ領域に移動すべきオブジェクトを精度良く検出することによって、外部ヒープ領域を効率的に利用できる計算機システム、メモリ管理方法及びメモリ管理プログラムを提供することを目的とする。
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、プログラムを実行するプロセッサと、メモリと、を備えた計算機システムであって、前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備え、前記プロセッサは、前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納し、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を繰り返し取得し、取得された前記参照関係を示す情報に基づいて、前記第2の領域に移動させるべき起点となるオブジェクトを検出し、検出された前記起点となるオブジェクトを前記第2の領域に移動させることを特徴とする。
本発明によれば、外部ヒープ領域(第2の領域)に移動すべきオブジェクトを精度良く検出することによって、外部ヒープ領域を効率的に利用することができる。
本発明は、上述した問題を考慮したものであって、外部ヒープ領域に移動すべきオブジェクトを精度良く検出することによって、外部ヒープ領域を効率的に利用できる計算機システム、メモリ管理方法及びメモリ管理プログラムを提供することを目的とする。
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、プログラムを実行するプロセッサと、メモリと、を備えた計算機システムであって、前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備え、前記プロセッサは、前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納し、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を繰り返し取得し、取得された前記参照関係を示す情報に基づいて、前記第2の領域に移動させるべき起点となるオブジェクトを検出し、検出された前記起点となるオブジェクトを前記第2の領域に移動させることを特徴とする。
本発明によれば、外部ヒープ領域(第2の領域)に移動すべきオブジェクトを精度良く検出することによって、外部ヒープ領域を効率的に利用することができる。
図1は、本発明の実施の形態の計算機システムの構成を示す図である。
図2は、所定の時点におけるJavaヒープ領域内のオブジェクト間の参照関係を示す図である。
図3は、図2のケースにおけるオブジェクト情報テーブルを示す図である。
図4は、図3のテーブルを基に生成されるクラス情報テーブルを示す図である。
図5は、複数の時点におけるJavaヒープ領域内のオブジェクト間の参照関係を示す図である。
図6は、図5の時刻t1におけるオブジェクト情報テーブルを示す図である。
図7は、図6のテーブルを基に生成されるクラス情報テーブルを示す図である。
図8A、図8B及び図8Cは、図5のケースにおけるオブジェクト情報テーブルを示す図である。
図9は、複数の時点におけるJavaヒープ領域及び外部ヒープブロック内のオブジェクト間の参照関係を示す図である。
図10は、参照先情報取得部の制御ロジックを示すフローチャートである。
図11は、参照元情報取得部の制御ロジックを示すフローチャートである。
図12は、表示画面例を示す模式図である。
図2は、所定の時点におけるJavaヒープ領域内のオブジェクト間の参照関係を示す図である。
図3は、図2のケースにおけるオブジェクト情報テーブルを示す図である。
図4は、図3のテーブルを基に生成されるクラス情報テーブルを示す図である。
図5は、複数の時点におけるJavaヒープ領域内のオブジェクト間の参照関係を示す図である。
図6は、図5の時刻t1におけるオブジェクト情報テーブルを示す図である。
図7は、図6のテーブルを基に生成されるクラス情報テーブルを示す図である。
図8A、図8B及び図8Cは、図5のケースにおけるオブジェクト情報テーブルを示す図である。
図9は、複数の時点におけるJavaヒープ領域及び外部ヒープブロック内のオブジェクト間の参照関係を示す図である。
図10は、参照先情報取得部の制御ロジックを示すフローチャートである。
図11は、参照元情報取得部の制御ロジックを示すフローチャートである。
図12は、表示画面例を示す模式図である。
以下、図面を用いて、本発明の実施の形態について説明する。
以下、本発明の実施の形態について図面に基づいて説明する。
図1は、本発明の実施の形態の計算機システム1の構成を示す図である。計算機システム1は、バス(不図示)を介して相互に接続された、補助記憶装置101、CPU(Central Processing Unit)102及びメモリ103を備え又後述するオブジェクト情報等を表示する表示装置122を備える。特に、メモリ103は、Javaヒープ領域(第1の記憶領域)117と、外部ヒープ領域(第2の記憶領域)120と、を備える。なお、Javaヒープ領域は、内部ヒープ領域と同義である。
補助記憶装置101は、各種データを記憶するためのHDD等の記憶装置である。この補助記憶装置101には、Javaプログラムを実行するためのJavaソースファイル104、Javaソースファイル104に基づいて生成されるJavaクラスファイル105、オブジェクト情報ファイル106、クラス情報ファイル107が格納される。オブジェクト情報ファイル106、クラス情報ファイル107については後述する。
CPU102は、各種処理(ここでは特にJavaVM108)を実行する演算処理装置である。JavaVM108は、メモリ103の不要になったメモリ領域を動的に解放するメモリ管理機構を備える言語処理実行システムである。このJavaVM108は、プログラム読込み部109、プログラム実行部110、GC実行部111、参照先情報取得部112、外部ヒープ処理部113を含む。なお、このJavaVM108は、CD、DVD等の各種記憶媒体に記憶される又はインターネット等のネットワークを介してダウンロード可能なものである。このようなJavaVM108が計算機システム1にインストールされることによって、CPU102はJavaVM108を実行可能な状態になる。
プログラム読込み部109は、補助記憶装置101からJavaソースファイル104を読み込み、このJavaソースファイル104をコンパイルしてJavaクラスファイル105を生成する。
プログラム実行部110は、Javaクラスファイル105を実行することによって、Javaプログラムを実行する。具体的には、Javaクラスファイル105内のメソッドのバイトコードを読み込んで実行することによって、Javaプログラムを実行する。
GC実行部111は、GCを実行する、すなわちJavaヒープ領域117に格納された不要なオブジェクト等のデータを消去することによって、Javaヒープ領域117を解放する。より具体的には、このGC実行部111は、Javaヒープ領域117の空き容量が少なくなった場合に、Javaヒープ領域117に格納されているオブジェクトの参照関係を示す情報を取得し、レジスタ、実行時スタック、グローバル変数等のルートセットから参照されていないオブジェクトを不要なオブジェクトとみなして消去する。
参照先情報取得部112は、特定の条件を満たす度に、Javaヒープ領域117に格納されたオブジェクトが参照しているオブジェクト、すなわち参照先、に関する情報を繰り返し取得(即ち複数回取得)する。取得された参照先情報は、Javaヒープ領域117内のオブジェクト情報テーブル118に出力される。なお、取得された参照先情報は、補助記憶装置101内のオブジェクト情報ファイル106にも出力可能である。
また参照先情報取得部112は、オブジェクト情報テーブル118を基に、オブジェクトの生成元のクラス毎に参照先情報をまとめたクラス情報テーブル119を作成する。なお、クラス毎の参照先情報は、補助記憶装置101のクラス情報ファイル107にも出力可能である。この参照先情報取得部112の詳細な処理内容は、図10を用いて後述する。
外部ヒープ処理部113は、メモリ103の外部ヒープ領域120に対する各種処理を実行する。この外部ヒープ処理部113は、外部ヒープ生成部114、外部ヒープ解放部115、参照元情報取得部116を含む。
外部ヒープ生成部114は、外部ヒープ領域120に外部ヒープブロック121−1~3(以下、総称する場合、「外部ヒープブロック121」という。)を生成する。
本実施形態の計算機システム1は、明示メモリ管理方式を採用しており、Javaクラスファイル105内で長命なオブジェクト(以下、「起点オブジェクト」という。)を指定する必要がある。指定された起点オブジェクトの生成命令が実行されると、外部ヒープ生成部114は外部ヒープ領域120に外部ヒープブロック121を生成する。この外部ヒープブロック121に、生成された起点オブジェクトが配置される。また、起点オブジェクトとの間で参照関係のあるオブジェクトは、GC実行部111によるGC実行時に、起点オブジェクトが配置された外部ヒープブロック121に移動される。このようにして、起点オブジェクトが生成される度に、外部ヒープブロック121はその都度生成される。
外部ヒープ解放部115は、外部ヒープ領域120内の不要な外部ヒープブロック121を解放する。具体的には、不要になった起点オブジェクトが配置された外部ヒープブロック121を削除する。このとき、外部ヒープブロック121に配置された起点オブジェクト以外のオブジェクトは、Javaヒープ領域117内やルートセットから参照されている場合は、Javaヒープ領域117に移動される。他方、Javaヒープ領域117内やルートセットから参照されていない場合は、起点オブジェクトと同様に削除される。
参照元情報取得部116は、外部ヒープ領域120内にある外部ヒープブロック121に対してバリア処理を施す。これにより、参照元情報取得部116は、外部ヒープブロック121に格納されたオブジェクトへのアクセスを検知し、同オブジェクトを参照しているオブジェクト、すなわち参照元、に関する情報を取得する。この参照元情報取得部116の詳細な処理内容は、図11を用いて後述する。
Javaヒープ領域117は、オブジェクト情報テーブル118、クラス情報テーブル119を格納するメモリ領域である。またJavaヒープ領域117には、プログラム実行部110がプログラムを実行することによって生成されたオブジェクトが格納される。このJavaヒープ領域117は、GC実行部111によるGCの対象のメモリ領域である。
オブジェクト情報テーブル118は、参照先情報取得部112によって取得されたオブジェクトの参照先情報を格納する。詳細は後述する。
クラス情報テーブル119は、参照先情報取得部112によって作成されたクラス毎の参照先情報を格納する。詳細は後述する。
外部ヒープ領域120は、Javaヒープ領域117に格納されたオブジェクトのうちの起点オブジェクトを、外部ヒープブロック121に格納するメモリ領域である。この外部ヒープ領域120は、GC実行部111によるGCの非対象のメモリ領域である。
また、表示装置122は、参照先情報取得部112によって作成されたクラス毎の参照先情報に関する情報が表示される装置である。また、計算機システム1は、後述するように、クラス毎の参照関係を自動的に検出するようになっているが、この検出した参照関係から、自動的に起点オブジェクトを決定することも、表示装置122を介して、ユーザが起点オブジェクトを任意に選択に選択することもできるようになっている。詳細は、後述する。
図2は、所定の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示す図である。スタック領域202は、Javaプログラムによって実行中のデータを一時的に保持するための領域である。各ノード(オブジェクト203~211等)は、Javaヒープ領域117に格納されたオブジェクトを示している。
GC実行部111がJavaヒープ領域117に対してGCを実行した場合、スタック領域202から直接又は間接的に参照されているオブジェクト(記号が付与されていないオブジェクト)は、必要なオブジェクトと判断される。一方、スタック領域202から直接又は間接的に参照されていないオブジェクト203~211は、不必要なオブジェクトと判断される。不必要と判断されたオブジェクト203~211は、メモリリークの原因となる可能性が高い。そのため、これらオブジェクト203~211をプロファイリングする必要がある。
そこで、本実施形態の計算機システム1では、以下に説明する方法により、オブジェクト203~211から外部ヒープ領域120に移動すべき起点オブジェクトを検出し、検出された起点オブジェクトを外部ヒープ領域120に移動させる。
まず、参照先情報取得部112は、Javaヒープ領域117に格納されたオブジェクト203~211の参照先情報を取得する。取得された参照先情報は、Javaヒープ領域117内のオブジェクト情報テーブル118に出力される。
図3は、図2のケースにおけるオブジェクト情報テーブル118を示す図である。このオブジェクト情報テーブル118は、図2のJavaヒープ領域117に格納されたオブジェクトの参照先情報を管理している。
オブジェクト情報テーブル118は、オブジェクト名301、クラス名302、参照先303及びサイズ304の各項目を含むレコードを保持する。
オブジェクト名301には、上記により不必要と判断されたオブジェクトの名前が格納される。クラス名302には、オブジェクトの生成元のクラスの名前が格納される。参照先303には、オブジェクトの参照先のオブジェクトの名前が格納される。サイズ304には、オブジェクト名301のオブジェクト単体のサイズが格納される。
本例では、オブジェクト名301には、不必要と判断されたオブジェクト203~211の名前であるx1~z3が格納される。クラス名302には、オブジェクトx1~x3の生成元のクラスの名前X、オブジェクトy1~y3の生成元のクラスの名前Y、オブジェクトz1~z3の生成元のクラスの名前Zが格納される。参照先303には、オブジェクトx1の参照先のオブジェクトの名前(z1、z2、z3)、オブジェクトx2の参照先のオブジェクトの名前(z1、z2)、オブジェクトx3の参照先のオブジェクトの名前(z1、z2)が格納される。なお、オブジェクトy1~z3は他のオブジェクトを参照していないため、参照先303は空欄である。サイズ304には、オブジェクトx1~x3のサイズとして1、オブジェクトy1~y3のサイズとして2、オブジェクトz1~z3のサイズとして3が格納される。
次に、参照先情報取得部112は、オブジェクト情報テーブル118を基に、オブジェクトの生成元のクラス毎の参照先情報を生成する(即ちオブジェクト情報テーブル118を組み合わせ、オブジェクト生成元のクラス毎の参照先を示す情報を生成する)。生成されたクラス毎の参照先情報は、Javaヒープ領域117内のクラス情報テーブル119に出力される。
具体的には、参照先情報取得部112は、まずオブジェクト情報テーブル118に格納されたオブジェクトの生成元のクラスX、Y、Zを全て抽出する。その後、抽出された各々のクラスの総オブジェクトサイズ(以下、「加重」という。)を算出する。加重とは、抽出されたクラスから生成された全てのオブジェクトのサイズと、そのオブジェクトの参照先の全てのオブジェクトのサイズと、を全て加算することによって得られる値である。その後、各々のクラスの加重をクラス情報テーブル119に出力する。
図4は、図3のテーブルを基に生成されるクラス情報テーブル119を示す図である。 クラス情報テーブル119は、クラス名401、サイズ402及び加重403の各項目を含むレコードを保持する。
クラス名401には、クラスの名前が格納される。サイズ402には、クラス単体のサイズが格納される。加重403には、各々のクラスの加重が格納される。
本例では、クラス名401には、抽出されたクラスの名前であるX、Y、Zが格納される。サイズ402には、各クラスのクラス単体のサイズ1、2、3が格納される。加重403には、各々のクラスX、Y、Zの加重が格納される。例えばクラスXの加重は、クラスXから生成された全てのオブジェクトx1、x2、x3のサイズと、各々のオブジェクトx1、x2、x3の参照先のオブジェクト(z1、z2、z3)、(z1、z2)、(z1、z2)のサイズと、を全て加算して得られる24である。クラスYの加重は、クラスYから生成された全てのオブジェクトy1、y2、y3のサイズを全て加算して得られる6である。クラスZの加重は、クラスZから生成された全てのオブジェクトz1(3個)、z2(3個)、z3のサイズを全て加算して得られる21である。
ここで、加重が大きいクラスほど、メモリリークの原因となるオブジェクト群の起点であると判定できる。そのため、このクラス情報テーブル119のケースでは、クラスXから生成されたオブジェクトx1、x2、x3を起点オブジェクトとして検出することができる。なお、加重が予め定められた閾値(例えば20)を超えた1又は2以上のクラス(例えばクラスX、Z)から生成されたオブジェクトx1、x2、x3、z1、z2を起点オブジェクトとして検出してもよい。
図5は、複数の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示す図である。
図2は、所定の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示した。一方、この図5では、スレッド実行中の時刻t1、t2、t3において、Javaヒープ領域117の状態がそれぞれ状態501、502、503の順に経時変化する場合のオブジェクト間の参照関係を示している。
状態501では、オブジェクト504の参照先はオブジェクト510である。状態502では、オブジェクト504の参照先はオブジェクト505である。状態503では、オブジェクト504の参照先はオブジェクト506である。
プログラム実行部110により実行されるプログラムによっては、図5のようにオブジェクトの参照先が経時変化する場合がある。図5に示す例では、最上位の参照元であると判定できるオブジェクト504が、起点オブジェクトとして相応しい。オブジェクト504が起点オブジェクトであることを検出することができれば、生成する外部ヒープブロック121は一つのみで済む。
図6は、図5の時刻t1におけるオブジェクト情報テーブル118を示す図である。このオブジェクト情報テーブル118は、図5の時刻t1においてJavaヒープ領域117に格納されたオブジェクトの参照先情報を管理している。
図6に示すオブジェクト情報テーブル118では、オブジェクトa1(図5のオブジェクト504)の参照先のオブジェクトはオブジェクトd1(図5のオブジェクト510)のみである。そのため、このオブジェクト情報テーブル118には、図5の時刻t2、t3のように、オブジェクト504の参照先のオブジェクトがオブジェクト505、506であるケースが反映されていない。
図7は、図6のテーブルを基に生成されるクラス情報テーブル119を示す図である。クラスAの加重は、クラスAから生成されたオブジェクトa1のサイズと、このオブジェクトa1の参照先のオブジェクトd1のサイズと、を全て加算して得られる5である。クラスBの加重は、クラスBから生成された全てのオブジェクトb1、b2のサイズと、各々のオブジェクトb1、b2の参照先のオブジェクト(c1、c2)、(c3)のサイズと、を全て加算して得られる13である。クラスCの加重は、クラスCから生成された全てのオブジェクトc1、c2、c3のサイズを全て加算して得られる9である。クラスDの加重は、クラスDから生成されたオブジェクトd1のサイズの4である。
図6のテーブルを基に生成されたクラス情報テーブル119では、加重が最も大きいクラスはクラスBである。そのため、クラスBから生成されたオブジェクトb1、b2(図5のオブジェクト505、506)を起点オブジェクトとして検出することができる。言い換えると、上記のように最上位の参照元であると判断できるオブジェクトa1(図5のオブジェクト504)を起点オブジェクトとして検出できない。
このような場合に、最上位の参照元であると判断できるオブジェクト504を起点オブジェクトとして検出するために、本実施形態の計算機システム1では、参照先情報取得部112は、特定の条件を満たす度に(例えば一定時間毎に)、Javaヒープ領域117に格納されたオブジェクト504~510の参照先情報を繰り返し取得する。取得された参照先情報は、オブジェクト情報テーブル118に出力される。
図8A、図8B及び図8Cは、図5のケースにおけるオブジェクト情報テーブル118を示す図である。図8A、図8B及び図8Cは、それぞれスレッド開始からΔt毎の時刻t1、t2、t3におけるオブジェクトの参照先情報を管理している。
図8Aに示すオブジェクト情報テーブル118では、図5の状態501におけるオブジェクトの参照先情報が管理されている。オブジェクトa1(図5のオブジェクト504)の参照先のオブジェクトは、オブジェクトd1(図5のオブジェクト510)である。図8Bに示すオブジェクト情報テーブル118では、図5の状態502におけるオブジェクトa1(504)の参照先のオブジェクトb1(505)が、オブジェクトa1の参照先に追加されている。図8Cに示すオブジェクト情報テーブル118では、図5の状態503におけるオブジェクトa1(504)の参照先のオブジェクトb2(505)が、オブジェクトa1の参照先に追加されている。
以上のように、参照先情報取得部112は、特定の条件を満たす度に、オブジェクトの参照先情報を繰り返し取得するとともに、取得された参照先情報をオブジェクト情報テーブル118に追加している。このようなオブジェクト情報テーブル118を基に生成されたクラス情報テーブル119(不図示)を用いることによって、最上位の参照元であると判断できるオブジェクトa1(図5のオブジェクト504)を起点オブジェクトとして検出することができる。
続いて、起点オブジェクトとして相応しくないオブジェクトが起点オブジェクトとして検出され、外部ヒープブロック121に移動された場合の対応処理について説明する。
図9は、複数の時点におけるJavaヒープ領域117及び外部ヒープブロック121内のオブジェクト間の参照関係を示す図である。この図9では、スレッド実行中の時刻t4、t5、t6において、Javaヒープ領域117及び外部ヒープブロック121の状態がそれぞれ状態901、902、903の順に経時変化する場合のオブジェクト間の参照関係を示している。
状態901では、オブジェクト908、909が起点オブジェクトとして検出され、それぞれ外部ヒープブロック121−1、121−2に移動されている。状態902では、オブジェクト907はオブジェクト908を参照している。状態903では、オブジェクト907はオブジェクト909を参照している。
図9に示す例では、最上位の参照元であると判定できるオブジェクト907が、起点オブジェクトとして相応しい。オブジェクト907が起点オブジェクトであることを検出することができれば、生成する外部ヒープブロック121は一つのみで済む。言い換えると、オブジェクト908、909は最適な起点オブジェクトとは言えない。そのため、以下に示す図10、図11、特に図11の制御ロジックにより、本実施形態の計算機システム1では、最適な起点オブジェクトとしてオブジェクト907を検出する。
図10は、参照先情報取得部112の制御ロジックを示すフローチャートである。
まずステップ1001では、参照先情報取得部112は、特定条件を満たすまで待機する(ステップ1001)。特定条件とは、一定時間経過する又はプログラム実行部110がプログラム実行中にオブジェクトの参照関係が変化する等の条件である。特定条件を満たした場合(ステップ1002でYES)、ステップ1003に進む。特定条件を満たさずにスレッドが終了した場合には(ステップ1002でNO)、処理を終了する。
ステップ1003に進んだ場合、参照先情報取得部112は、Javaヒープ領域117内に未処理のオブジェクトが存在するか否かを調査する(ステップ1003)。未処理のオブジェクトが存在する場合には(ステップ1004でYES)、ステップ1005に進み、参照先情報取得部112は、未処理のオブジェクトの状態を処理済みに変更し、そのオブジェクトの参照先のオブジェクトに関する情報を調査・取得する(ステップ1005)。その後ステップ1006では、参照先情報取得部112は、取得された参照先のオブジェクトに関する情報がオブジェクト情報テーブル118に未登録か又は登録済みかを調査する(ステップ1006)。未登録であって登録が必要な場合には(ステップ1007でYES)、ステップ1008に進み、参照先情報取得部112は、参照先のオブジェクトに関する情報をオブジェクト情報テーブル118に登録する(ステップ1008)。その後、ステップ1003に戻って、参照先情報取得部112は、次の未処理のオブジェクトが存在するか調査する。一方、登録済みであって登録が不要な場合には(ステップ1007でNO)、ステップ1003に戻る。なお、ステップ1004において未処理のオブジェクトが存在しない、すなわち全てのオブジェクトの処理が完了した又は処理すべきオブジェクトが存在しない場合には(ステップ1004でNO)、ステップ1001に戻って、参照先情報取得部112は、再び待機状態になる。
以上に示す制御ロジックにより、参照先情報取得部112は、特定条件を満たす度に、Javaヒープ領域117内の全ての未処理のオブジェクトの参照先情報を繰り返し取得し、オブジェクト情報テーブル118に登録する。
図11は、参照元情報取得部116の制御ロジックを示すフローチャートである。
まずステップ1101では、参照元情報取得部116は、現在のオブジェクト情報テーブル118を基に各クラスの加重を算出し、クラス情報テーブル119に登録する(ステップ1101)。次にステップ1102では、参照元情報取得部116は、クラス情報テーブル119を参照して、加重が閾値以上のクラスが存在するか否かを判定する(ステップ1102)。加重が閾値以上のクラスが存在する場合には(ステップ1102でYES)、ステップ1103に進む。一方、加重が閾値以上のクラスが存在しない場合には(ステップ1102でNO)、処理を終了する。
ステップ1103に進んだ場合、参照元情報取得部116は、加重が閾値以上のクラスから生成されるオブジェクト、つまり起点オブジェクトを格納する外部ヒープ領域120(外部ヒープブロック121)にバリア処理を施す(ステップ1103)。ここでいうバリア処理とは、起点オブジェクトに対する他のオブジェクトのアクセス(図9の場合にはオブジェクト908、909に対するオブジェクト907からのアクセス)を検知するために施される処理である。
その後ステップ1104では、参照元情報取得部116は、バリア済み領域に対する他のオブジェクトのアクセスがあったか否かを検出する(ステップ1104)。他のオブジェクトのアクセスがあった場合には(ステップ1104でYES)、ステップ1105に進んで、参照元情報取得部116は、アクセスしたオブジェクト、すなわち参照元のオブジェクトに関する情報を、アクセスされたオブジェクトに記録する(ステップ1105)。ここでは、アクセスが検知されるとJavaVM108へ検知信号が送信されるので、アクセスされたオブジェクト内に参照元のオブジェクトに関する情報を記録することができる。一方、他のオブジェクトのアクセスがない場合には(ステップ1104でNO)、スレッド実行中は(ステップ1106でNO)、ステップ1102に戻って処理を繰り返す。スレッドが終了した場合には(ステップ1106でYES)、参照元情報取得部116は、ステップ1105で記録された参照元のオブジェクトに関する情報を基に、オブジェクト情報テーブル118を更新し(ステップ1108)、処理を終了する。
以上に示す制御ロジックにより、参照元情報取得部116は、起点オブジェクトが格納された外部ヒープ領域120にアクセスするオブジェクトを全て抽出し、抽出されたオブジェクトに関する情報を基に、オブジェクト情報テーブル118を起点オブジェクトの検出に最適なテーブルに更新することができる。
以上の処理により得られた結果に基づいて、起点となるオブジェクトを、計算機システム1が自動に若しくはユーザが手動で指定することができる。自動で指定する場合は、例えば、加重値が最も大であるクラスのオブジェクトを起点オブジェクトとして指定するようにしてもよい。手動で指定する場合は、以下に説明する表示装置122の画面を介して指定してもよい。
表示装置122に表示される画面の例について説明する。図12は、表示装置122に表示される画面例を示す。画面上には、各クラス123に関してインスタンス数124、サイズ値125及び加重値126といった情報を一覧表示するとともに、起点オブジェックトの生成場所127を表示するようになっている。
図12において、インスタンス数124、サイズ値125及び加重値126といった情報は、加重値の大きさに応じて大であるものを昇順で表示している。生成場所127は、クラス毎のオブジェクトを内部ヒープブロック或いは外部ヒープブロックとするかをユーザが選択可能なチェックボックスが表示される。即ち加重値が最大であるクラスAを起点オブジェクトとして外部ヒープブロックに設ける場合、ユーザ操作により生成場所127の「起点(外部)」にチェックボックスを入れることで、指定を行うことができるようになっている。クラスB及びCは、起点オブジェクトとしないため、「通常(内部)」にチェックボックスを入れる。)。
以上説明してきた本実施形態の計算機システム1によれば、外部ヒープ領域に移動すべき起点オブジェクトを精度良く検出し、外部ヒープ領域を効率的に利用することができる。これに伴い、GCの発生頻度を抑えることもできる。また、図9の時刻t4のようなケースを防ぐことによって、外部ヒープブロックの数及び生成・解放に係るコストを抑えることができる。また、表示装置122を介してクラス毎の加重等をユーザに提供することができ、その加重に基づいてユーザが起点オブジェクトを任意に指定することもでき、起点オブジェクトの指定に関する利便性を向上させることができる。
なお、計算機システム1のテスト環境において、最適な起点オブジェクトを検出するまでにオブジェクト情報テーブル118及びクラス情報テーブル119に格納された各種情報を、補助記憶装置101内のオブジェクト情報ファイル106及びクラス情報ファイル107に蓄積させておくことが好ましい。この場合には、計算機システム1の本番環境において、オブジェクト情報ファイル106及びクラス情報ファイル107を用いることによって再度オブジェクト情報テーブル118及びクラス情報テーブル119を生成することによるオーバヘッドを起こすことなく、最適な起点オブジェクトを検出することができる。
以下、本発明の実施の形態について図面に基づいて説明する。
図1は、本発明の実施の形態の計算機システム1の構成を示す図である。計算機システム1は、バス(不図示)を介して相互に接続された、補助記憶装置101、CPU(Central Processing Unit)102及びメモリ103を備え又後述するオブジェクト情報等を表示する表示装置122を備える。特に、メモリ103は、Javaヒープ領域(第1の記憶領域)117と、外部ヒープ領域(第2の記憶領域)120と、を備える。なお、Javaヒープ領域は、内部ヒープ領域と同義である。
補助記憶装置101は、各種データを記憶するためのHDD等の記憶装置である。この補助記憶装置101には、Javaプログラムを実行するためのJavaソースファイル104、Javaソースファイル104に基づいて生成されるJavaクラスファイル105、オブジェクト情報ファイル106、クラス情報ファイル107が格納される。オブジェクト情報ファイル106、クラス情報ファイル107については後述する。
CPU102は、各種処理(ここでは特にJavaVM108)を実行する演算処理装置である。JavaVM108は、メモリ103の不要になったメモリ領域を動的に解放するメモリ管理機構を備える言語処理実行システムである。このJavaVM108は、プログラム読込み部109、プログラム実行部110、GC実行部111、参照先情報取得部112、外部ヒープ処理部113を含む。なお、このJavaVM108は、CD、DVD等の各種記憶媒体に記憶される又はインターネット等のネットワークを介してダウンロード可能なものである。このようなJavaVM108が計算機システム1にインストールされることによって、CPU102はJavaVM108を実行可能な状態になる。
プログラム読込み部109は、補助記憶装置101からJavaソースファイル104を読み込み、このJavaソースファイル104をコンパイルしてJavaクラスファイル105を生成する。
プログラム実行部110は、Javaクラスファイル105を実行することによって、Javaプログラムを実行する。具体的には、Javaクラスファイル105内のメソッドのバイトコードを読み込んで実行することによって、Javaプログラムを実行する。
GC実行部111は、GCを実行する、すなわちJavaヒープ領域117に格納された不要なオブジェクト等のデータを消去することによって、Javaヒープ領域117を解放する。より具体的には、このGC実行部111は、Javaヒープ領域117の空き容量が少なくなった場合に、Javaヒープ領域117に格納されているオブジェクトの参照関係を示す情報を取得し、レジスタ、実行時スタック、グローバル変数等のルートセットから参照されていないオブジェクトを不要なオブジェクトとみなして消去する。
参照先情報取得部112は、特定の条件を満たす度に、Javaヒープ領域117に格納されたオブジェクトが参照しているオブジェクト、すなわち参照先、に関する情報を繰り返し取得(即ち複数回取得)する。取得された参照先情報は、Javaヒープ領域117内のオブジェクト情報テーブル118に出力される。なお、取得された参照先情報は、補助記憶装置101内のオブジェクト情報ファイル106にも出力可能である。
また参照先情報取得部112は、オブジェクト情報テーブル118を基に、オブジェクトの生成元のクラス毎に参照先情報をまとめたクラス情報テーブル119を作成する。なお、クラス毎の参照先情報は、補助記憶装置101のクラス情報ファイル107にも出力可能である。この参照先情報取得部112の詳細な処理内容は、図10を用いて後述する。
外部ヒープ処理部113は、メモリ103の外部ヒープ領域120に対する各種処理を実行する。この外部ヒープ処理部113は、外部ヒープ生成部114、外部ヒープ解放部115、参照元情報取得部116を含む。
外部ヒープ生成部114は、外部ヒープ領域120に外部ヒープブロック121−1~3(以下、総称する場合、「外部ヒープブロック121」という。)を生成する。
本実施形態の計算機システム1は、明示メモリ管理方式を採用しており、Javaクラスファイル105内で長命なオブジェクト(以下、「起点オブジェクト」という。)を指定する必要がある。指定された起点オブジェクトの生成命令が実行されると、外部ヒープ生成部114は外部ヒープ領域120に外部ヒープブロック121を生成する。この外部ヒープブロック121に、生成された起点オブジェクトが配置される。また、起点オブジェクトとの間で参照関係のあるオブジェクトは、GC実行部111によるGC実行時に、起点オブジェクトが配置された外部ヒープブロック121に移動される。このようにして、起点オブジェクトが生成される度に、外部ヒープブロック121はその都度生成される。
外部ヒープ解放部115は、外部ヒープ領域120内の不要な外部ヒープブロック121を解放する。具体的には、不要になった起点オブジェクトが配置された外部ヒープブロック121を削除する。このとき、外部ヒープブロック121に配置された起点オブジェクト以外のオブジェクトは、Javaヒープ領域117内やルートセットから参照されている場合は、Javaヒープ領域117に移動される。他方、Javaヒープ領域117内やルートセットから参照されていない場合は、起点オブジェクトと同様に削除される。
参照元情報取得部116は、外部ヒープ領域120内にある外部ヒープブロック121に対してバリア処理を施す。これにより、参照元情報取得部116は、外部ヒープブロック121に格納されたオブジェクトへのアクセスを検知し、同オブジェクトを参照しているオブジェクト、すなわち参照元、に関する情報を取得する。この参照元情報取得部116の詳細な処理内容は、図11を用いて後述する。
Javaヒープ領域117は、オブジェクト情報テーブル118、クラス情報テーブル119を格納するメモリ領域である。またJavaヒープ領域117には、プログラム実行部110がプログラムを実行することによって生成されたオブジェクトが格納される。このJavaヒープ領域117は、GC実行部111によるGCの対象のメモリ領域である。
オブジェクト情報テーブル118は、参照先情報取得部112によって取得されたオブジェクトの参照先情報を格納する。詳細は後述する。
クラス情報テーブル119は、参照先情報取得部112によって作成されたクラス毎の参照先情報を格納する。詳細は後述する。
外部ヒープ領域120は、Javaヒープ領域117に格納されたオブジェクトのうちの起点オブジェクトを、外部ヒープブロック121に格納するメモリ領域である。この外部ヒープ領域120は、GC実行部111によるGCの非対象のメモリ領域である。
また、表示装置122は、参照先情報取得部112によって作成されたクラス毎の参照先情報に関する情報が表示される装置である。また、計算機システム1は、後述するように、クラス毎の参照関係を自動的に検出するようになっているが、この検出した参照関係から、自動的に起点オブジェクトを決定することも、表示装置122を介して、ユーザが起点オブジェクトを任意に選択に選択することもできるようになっている。詳細は、後述する。
図2は、所定の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示す図である。スタック領域202は、Javaプログラムによって実行中のデータを一時的に保持するための領域である。各ノード(オブジェクト203~211等)は、Javaヒープ領域117に格納されたオブジェクトを示している。
GC実行部111がJavaヒープ領域117に対してGCを実行した場合、スタック領域202から直接又は間接的に参照されているオブジェクト(記号が付与されていないオブジェクト)は、必要なオブジェクトと判断される。一方、スタック領域202から直接又は間接的に参照されていないオブジェクト203~211は、不必要なオブジェクトと判断される。不必要と判断されたオブジェクト203~211は、メモリリークの原因となる可能性が高い。そのため、これらオブジェクト203~211をプロファイリングする必要がある。
そこで、本実施形態の計算機システム1では、以下に説明する方法により、オブジェクト203~211から外部ヒープ領域120に移動すべき起点オブジェクトを検出し、検出された起点オブジェクトを外部ヒープ領域120に移動させる。
まず、参照先情報取得部112は、Javaヒープ領域117に格納されたオブジェクト203~211の参照先情報を取得する。取得された参照先情報は、Javaヒープ領域117内のオブジェクト情報テーブル118に出力される。
図3は、図2のケースにおけるオブジェクト情報テーブル118を示す図である。このオブジェクト情報テーブル118は、図2のJavaヒープ領域117に格納されたオブジェクトの参照先情報を管理している。
オブジェクト情報テーブル118は、オブジェクト名301、クラス名302、参照先303及びサイズ304の各項目を含むレコードを保持する。
オブジェクト名301には、上記により不必要と判断されたオブジェクトの名前が格納される。クラス名302には、オブジェクトの生成元のクラスの名前が格納される。参照先303には、オブジェクトの参照先のオブジェクトの名前が格納される。サイズ304には、オブジェクト名301のオブジェクト単体のサイズが格納される。
本例では、オブジェクト名301には、不必要と判断されたオブジェクト203~211の名前であるx1~z3が格納される。クラス名302には、オブジェクトx1~x3の生成元のクラスの名前X、オブジェクトy1~y3の生成元のクラスの名前Y、オブジェクトz1~z3の生成元のクラスの名前Zが格納される。参照先303には、オブジェクトx1の参照先のオブジェクトの名前(z1、z2、z3)、オブジェクトx2の参照先のオブジェクトの名前(z1、z2)、オブジェクトx3の参照先のオブジェクトの名前(z1、z2)が格納される。なお、オブジェクトy1~z3は他のオブジェクトを参照していないため、参照先303は空欄である。サイズ304には、オブジェクトx1~x3のサイズとして1、オブジェクトy1~y3のサイズとして2、オブジェクトz1~z3のサイズとして3が格納される。
次に、参照先情報取得部112は、オブジェクト情報テーブル118を基に、オブジェクトの生成元のクラス毎の参照先情報を生成する(即ちオブジェクト情報テーブル118を組み合わせ、オブジェクト生成元のクラス毎の参照先を示す情報を生成する)。生成されたクラス毎の参照先情報は、Javaヒープ領域117内のクラス情報テーブル119に出力される。
具体的には、参照先情報取得部112は、まずオブジェクト情報テーブル118に格納されたオブジェクトの生成元のクラスX、Y、Zを全て抽出する。その後、抽出された各々のクラスの総オブジェクトサイズ(以下、「加重」という。)を算出する。加重とは、抽出されたクラスから生成された全てのオブジェクトのサイズと、そのオブジェクトの参照先の全てのオブジェクトのサイズと、を全て加算することによって得られる値である。その後、各々のクラスの加重をクラス情報テーブル119に出力する。
図4は、図3のテーブルを基に生成されるクラス情報テーブル119を示す図である。 クラス情報テーブル119は、クラス名401、サイズ402及び加重403の各項目を含むレコードを保持する。
クラス名401には、クラスの名前が格納される。サイズ402には、クラス単体のサイズが格納される。加重403には、各々のクラスの加重が格納される。
本例では、クラス名401には、抽出されたクラスの名前であるX、Y、Zが格納される。サイズ402には、各クラスのクラス単体のサイズ1、2、3が格納される。加重403には、各々のクラスX、Y、Zの加重が格納される。例えばクラスXの加重は、クラスXから生成された全てのオブジェクトx1、x2、x3のサイズと、各々のオブジェクトx1、x2、x3の参照先のオブジェクト(z1、z2、z3)、(z1、z2)、(z1、z2)のサイズと、を全て加算して得られる24である。クラスYの加重は、クラスYから生成された全てのオブジェクトy1、y2、y3のサイズを全て加算して得られる6である。クラスZの加重は、クラスZから生成された全てのオブジェクトz1(3個)、z2(3個)、z3のサイズを全て加算して得られる21である。
ここで、加重が大きいクラスほど、メモリリークの原因となるオブジェクト群の起点であると判定できる。そのため、このクラス情報テーブル119のケースでは、クラスXから生成されたオブジェクトx1、x2、x3を起点オブジェクトとして検出することができる。なお、加重が予め定められた閾値(例えば20)を超えた1又は2以上のクラス(例えばクラスX、Z)から生成されたオブジェクトx1、x2、x3、z1、z2を起点オブジェクトとして検出してもよい。
図5は、複数の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示す図である。
図2は、所定の時点におけるJavaヒープ領域117内のオブジェクト間の参照関係を示した。一方、この図5では、スレッド実行中の時刻t1、t2、t3において、Javaヒープ領域117の状態がそれぞれ状態501、502、503の順に経時変化する場合のオブジェクト間の参照関係を示している。
状態501では、オブジェクト504の参照先はオブジェクト510である。状態502では、オブジェクト504の参照先はオブジェクト505である。状態503では、オブジェクト504の参照先はオブジェクト506である。
プログラム実行部110により実行されるプログラムによっては、図5のようにオブジェクトの参照先が経時変化する場合がある。図5に示す例では、最上位の参照元であると判定できるオブジェクト504が、起点オブジェクトとして相応しい。オブジェクト504が起点オブジェクトであることを検出することができれば、生成する外部ヒープブロック121は一つのみで済む。
図6は、図5の時刻t1におけるオブジェクト情報テーブル118を示す図である。このオブジェクト情報テーブル118は、図5の時刻t1においてJavaヒープ領域117に格納されたオブジェクトの参照先情報を管理している。
図6に示すオブジェクト情報テーブル118では、オブジェクトa1(図5のオブジェクト504)の参照先のオブジェクトはオブジェクトd1(図5のオブジェクト510)のみである。そのため、このオブジェクト情報テーブル118には、図5の時刻t2、t3のように、オブジェクト504の参照先のオブジェクトがオブジェクト505、506であるケースが反映されていない。
図7は、図6のテーブルを基に生成されるクラス情報テーブル119を示す図である。クラスAの加重は、クラスAから生成されたオブジェクトa1のサイズと、このオブジェクトa1の参照先のオブジェクトd1のサイズと、を全て加算して得られる5である。クラスBの加重は、クラスBから生成された全てのオブジェクトb1、b2のサイズと、各々のオブジェクトb1、b2の参照先のオブジェクト(c1、c2)、(c3)のサイズと、を全て加算して得られる13である。クラスCの加重は、クラスCから生成された全てのオブジェクトc1、c2、c3のサイズを全て加算して得られる9である。クラスDの加重は、クラスDから生成されたオブジェクトd1のサイズの4である。
図6のテーブルを基に生成されたクラス情報テーブル119では、加重が最も大きいクラスはクラスBである。そのため、クラスBから生成されたオブジェクトb1、b2(図5のオブジェクト505、506)を起点オブジェクトとして検出することができる。言い換えると、上記のように最上位の参照元であると判断できるオブジェクトa1(図5のオブジェクト504)を起点オブジェクトとして検出できない。
このような場合に、最上位の参照元であると判断できるオブジェクト504を起点オブジェクトとして検出するために、本実施形態の計算機システム1では、参照先情報取得部112は、特定の条件を満たす度に(例えば一定時間毎に)、Javaヒープ領域117に格納されたオブジェクト504~510の参照先情報を繰り返し取得する。取得された参照先情報は、オブジェクト情報テーブル118に出力される。
図8A、図8B及び図8Cは、図5のケースにおけるオブジェクト情報テーブル118を示す図である。図8A、図8B及び図8Cは、それぞれスレッド開始からΔt毎の時刻t1、t2、t3におけるオブジェクトの参照先情報を管理している。
図8Aに示すオブジェクト情報テーブル118では、図5の状態501におけるオブジェクトの参照先情報が管理されている。オブジェクトa1(図5のオブジェクト504)の参照先のオブジェクトは、オブジェクトd1(図5のオブジェクト510)である。図8Bに示すオブジェクト情報テーブル118では、図5の状態502におけるオブジェクトa1(504)の参照先のオブジェクトb1(505)が、オブジェクトa1の参照先に追加されている。図8Cに示すオブジェクト情報テーブル118では、図5の状態503におけるオブジェクトa1(504)の参照先のオブジェクトb2(505)が、オブジェクトa1の参照先に追加されている。
以上のように、参照先情報取得部112は、特定の条件を満たす度に、オブジェクトの参照先情報を繰り返し取得するとともに、取得された参照先情報をオブジェクト情報テーブル118に追加している。このようなオブジェクト情報テーブル118を基に生成されたクラス情報テーブル119(不図示)を用いることによって、最上位の参照元であると判断できるオブジェクトa1(図5のオブジェクト504)を起点オブジェクトとして検出することができる。
続いて、起点オブジェクトとして相応しくないオブジェクトが起点オブジェクトとして検出され、外部ヒープブロック121に移動された場合の対応処理について説明する。
図9は、複数の時点におけるJavaヒープ領域117及び外部ヒープブロック121内のオブジェクト間の参照関係を示す図である。この図9では、スレッド実行中の時刻t4、t5、t6において、Javaヒープ領域117及び外部ヒープブロック121の状態がそれぞれ状態901、902、903の順に経時変化する場合のオブジェクト間の参照関係を示している。
状態901では、オブジェクト908、909が起点オブジェクトとして検出され、それぞれ外部ヒープブロック121−1、121−2に移動されている。状態902では、オブジェクト907はオブジェクト908を参照している。状態903では、オブジェクト907はオブジェクト909を参照している。
図9に示す例では、最上位の参照元であると判定できるオブジェクト907が、起点オブジェクトとして相応しい。オブジェクト907が起点オブジェクトであることを検出することができれば、生成する外部ヒープブロック121は一つのみで済む。言い換えると、オブジェクト908、909は最適な起点オブジェクトとは言えない。そのため、以下に示す図10、図11、特に図11の制御ロジックにより、本実施形態の計算機システム1では、最適な起点オブジェクトとしてオブジェクト907を検出する。
図10は、参照先情報取得部112の制御ロジックを示すフローチャートである。
まずステップ1001では、参照先情報取得部112は、特定条件を満たすまで待機する(ステップ1001)。特定条件とは、一定時間経過する又はプログラム実行部110がプログラム実行中にオブジェクトの参照関係が変化する等の条件である。特定条件を満たした場合(ステップ1002でYES)、ステップ1003に進む。特定条件を満たさずにスレッドが終了した場合には(ステップ1002でNO)、処理を終了する。
ステップ1003に進んだ場合、参照先情報取得部112は、Javaヒープ領域117内に未処理のオブジェクトが存在するか否かを調査する(ステップ1003)。未処理のオブジェクトが存在する場合には(ステップ1004でYES)、ステップ1005に進み、参照先情報取得部112は、未処理のオブジェクトの状態を処理済みに変更し、そのオブジェクトの参照先のオブジェクトに関する情報を調査・取得する(ステップ1005)。その後ステップ1006では、参照先情報取得部112は、取得された参照先のオブジェクトに関する情報がオブジェクト情報テーブル118に未登録か又は登録済みかを調査する(ステップ1006)。未登録であって登録が必要な場合には(ステップ1007でYES)、ステップ1008に進み、参照先情報取得部112は、参照先のオブジェクトに関する情報をオブジェクト情報テーブル118に登録する(ステップ1008)。その後、ステップ1003に戻って、参照先情報取得部112は、次の未処理のオブジェクトが存在するか調査する。一方、登録済みであって登録が不要な場合には(ステップ1007でNO)、ステップ1003に戻る。なお、ステップ1004において未処理のオブジェクトが存在しない、すなわち全てのオブジェクトの処理が完了した又は処理すべきオブジェクトが存在しない場合には(ステップ1004でNO)、ステップ1001に戻って、参照先情報取得部112は、再び待機状態になる。
以上に示す制御ロジックにより、参照先情報取得部112は、特定条件を満たす度に、Javaヒープ領域117内の全ての未処理のオブジェクトの参照先情報を繰り返し取得し、オブジェクト情報テーブル118に登録する。
図11は、参照元情報取得部116の制御ロジックを示すフローチャートである。
まずステップ1101では、参照元情報取得部116は、現在のオブジェクト情報テーブル118を基に各クラスの加重を算出し、クラス情報テーブル119に登録する(ステップ1101)。次にステップ1102では、参照元情報取得部116は、クラス情報テーブル119を参照して、加重が閾値以上のクラスが存在するか否かを判定する(ステップ1102)。加重が閾値以上のクラスが存在する場合には(ステップ1102でYES)、ステップ1103に進む。一方、加重が閾値以上のクラスが存在しない場合には(ステップ1102でNO)、処理を終了する。
ステップ1103に進んだ場合、参照元情報取得部116は、加重が閾値以上のクラスから生成されるオブジェクト、つまり起点オブジェクトを格納する外部ヒープ領域120(外部ヒープブロック121)にバリア処理を施す(ステップ1103)。ここでいうバリア処理とは、起点オブジェクトに対する他のオブジェクトのアクセス(図9の場合にはオブジェクト908、909に対するオブジェクト907からのアクセス)を検知するために施される処理である。
その後ステップ1104では、参照元情報取得部116は、バリア済み領域に対する他のオブジェクトのアクセスがあったか否かを検出する(ステップ1104)。他のオブジェクトのアクセスがあった場合には(ステップ1104でYES)、ステップ1105に進んで、参照元情報取得部116は、アクセスしたオブジェクト、すなわち参照元のオブジェクトに関する情報を、アクセスされたオブジェクトに記録する(ステップ1105)。ここでは、アクセスが検知されるとJavaVM108へ検知信号が送信されるので、アクセスされたオブジェクト内に参照元のオブジェクトに関する情報を記録することができる。一方、他のオブジェクトのアクセスがない場合には(ステップ1104でNO)、スレッド実行中は(ステップ1106でNO)、ステップ1102に戻って処理を繰り返す。スレッドが終了した場合には(ステップ1106でYES)、参照元情報取得部116は、ステップ1105で記録された参照元のオブジェクトに関する情報を基に、オブジェクト情報テーブル118を更新し(ステップ1108)、処理を終了する。
以上に示す制御ロジックにより、参照元情報取得部116は、起点オブジェクトが格納された外部ヒープ領域120にアクセスするオブジェクトを全て抽出し、抽出されたオブジェクトに関する情報を基に、オブジェクト情報テーブル118を起点オブジェクトの検出に最適なテーブルに更新することができる。
以上の処理により得られた結果に基づいて、起点となるオブジェクトを、計算機システム1が自動に若しくはユーザが手動で指定することができる。自動で指定する場合は、例えば、加重値が最も大であるクラスのオブジェクトを起点オブジェクトとして指定するようにしてもよい。手動で指定する場合は、以下に説明する表示装置122の画面を介して指定してもよい。
表示装置122に表示される画面の例について説明する。図12は、表示装置122に表示される画面例を示す。画面上には、各クラス123に関してインスタンス数124、サイズ値125及び加重値126といった情報を一覧表示するとともに、起点オブジェックトの生成場所127を表示するようになっている。
図12において、インスタンス数124、サイズ値125及び加重値126といった情報は、加重値の大きさに応じて大であるものを昇順で表示している。生成場所127は、クラス毎のオブジェクトを内部ヒープブロック或いは外部ヒープブロックとするかをユーザが選択可能なチェックボックスが表示される。即ち加重値が最大であるクラスAを起点オブジェクトとして外部ヒープブロックに設ける場合、ユーザ操作により生成場所127の「起点(外部)」にチェックボックスを入れることで、指定を行うことができるようになっている。クラスB及びCは、起点オブジェクトとしないため、「通常(内部)」にチェックボックスを入れる。)。
以上説明してきた本実施形態の計算機システム1によれば、外部ヒープ領域に移動すべき起点オブジェクトを精度良く検出し、外部ヒープ領域を効率的に利用することができる。これに伴い、GCの発生頻度を抑えることもできる。また、図9の時刻t4のようなケースを防ぐことによって、外部ヒープブロックの数及び生成・解放に係るコストを抑えることができる。また、表示装置122を介してクラス毎の加重等をユーザに提供することができ、その加重に基づいてユーザが起点オブジェクトを任意に指定することもでき、起点オブジェクトの指定に関する利便性を向上させることができる。
なお、計算機システム1のテスト環境において、最適な起点オブジェクトを検出するまでにオブジェクト情報テーブル118及びクラス情報テーブル119に格納された各種情報を、補助記憶装置101内のオブジェクト情報ファイル106及びクラス情報ファイル107に蓄積させておくことが好ましい。この場合には、計算機システム1の本番環境において、オブジェクト情報ファイル106及びクラス情報ファイル107を用いることによって再度オブジェクト情報テーブル118及びクラス情報テーブル119を生成することによるオーバヘッドを起こすことなく、最適な起点オブジェクトを検出することができる。
Claims (15)
- プログラムを実行するプロセッサと、メモリと、を備えた計算機システムであって、
前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備え、
前記プロセッサは、
前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納し、
前記第1の領域に格納されたオブジェクトの参照関係を示す情報を複数回取得し、
それら取得された前記参照関係を示す情報を組み合わせた情報に基づいて、前記第2の領域に移動すべき起点となるオブジェクトを検出し、
検出された前記起点となるオブジェクトを前記第2の領域に移動させることを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記プロセッサは、所定時間が経過する度に、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を取得することを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記プロセッサは、前記プログラムの実行中に、前記第1の領域に格納されたオブジェクトの参照関係が変化する度に、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を取得することを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記プロセッサは、
前記第1の領域に格納されたオブジェクトの生成元のクラス毎に、前記クラスから生成されたオブジェクトのサイズと、該生成されたオブジェクトの参照先のオブジェクトのサイズと、の総和である加重を、取得された前記参照関係を示す情報から算出し、
算出されたクラス毎の加重に基づいて、前記起点となるオブジェクトを検出することを特徴とする記載の計算機システム。 - 請求項1に記載の計算機システムであって、
前記プロセッサは、
前記第2の領域にガード処理をし、
ガード処理がされた前記第2の領域に格納されたオブジェクトに、前記第1の領域に格納されたオブジェクトのアクセスがあった場合に、該第1の領域に格納されたオブジェクトの参照関係を示す情報に、該第2の領域に格納されたオブジェクトを追加することを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記計算機システムは、データを格納するための補助記憶装置をさらに備え、
前記補助記憶装置には、当該計算機システムのテスト環境において検出された前記起点となるオブジェクトを求めるための情報が、本番環境用に格納されることを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記計算機システムは、表示装置をさらに備え、
前記プロセッサは、
前記組み合わせた情報を表示装置に表示することを特徴とする計算機システム。 - プログラムを実行するプロセッサと、メモリと、を備えた計算機システムにおけるメモリ管理方法であって、
前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備えており、
前記方法は、
前記プロセッサが、前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納する手順と、
前記プロセッサが、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を複数回取得する手順と、
前記プロセッサが、それら取得された前記参照関係を示す情報を組み合わせた情報に基づいて、前記第2の領域に移動すべき起点となるオブジェクトを検出する手順と、
前記プロセッサが、検出された前記起点となるオブジェクトを前記第2の領域に移動させる手順と、
を含むことを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記プロセッサは、所定時間が経過する度に、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を取得することを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記プロセッサは、前記プログラムの実行中に、前記第1の領域に格納されたオブジェクトの参照関係が変化する度に、前記第1の領域に格納されたオブジェクトの参照関係を示す情報を取得することを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記起点となるオブジェクトを検出する手順において、
前記プロセッサは、前記第1の領域に格納されたオブジェクトの生成元のクラス毎に、前記クラスから生成されたオブジェクトのサイズと、該生成されたオブジェクトの参照先のオブジェクトのサイズと、の総和である加重を、取得された前記参照関係を示す情報から算出し、
算出されたクラス毎の加重に基づいて、前記起点となるオブジェクトを検出することを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記方法は、さらに、
前記プロセッサが、前記第2の領域にガード処理をする手順と、
ガード処理がされた第2の領域に格納されたオブジェクトに、前記第1の領域に格納されたオブジェクトのアクセスがあった場合に、前記プロセッサが、該第1の領域に格納されたオブジェクトの参照関係を示す情報に、該第2の領域に格納されたオブジェクトを追加する手順と、
を含むことを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記計算機システムは、データを格納するための補助記憶装置をさらに備え、
前記方法は、
前記プロセッサが、当該計算機システムのテスト環境において検出された前記起点となるオブジェクトを求めるための情報を、本番環境用に前記補助記憶装置に格納する手順を含むことを特徴とするメモリ管理方法。 - 請求項8に記載のメモリ管理方法であって、
前記計算機システムは、表示装置をさらに備え、
前記方法は、
前記組み合わせた情報を前記表示装置に表示する手順を更に含むことを特徴とするメモリ管理方法。 - プログラムを実行するプロセッサと、メモリと、を備えた計算機システムに用いられるメモリ管理プログラムであって、
前記メモリは、ガベージコレクタによって管理される第1の領域と、ガベージコレクタによって管理されない第2の領域と、を備えており、
前記メモリ管理プログラムは、
前記プログラムを実行することによって生成されたオブジェクトを、前記第1の領域に格納する手順と、
前記第1の領域に格納されたオブジェクトの参照関係を示す情報を複数回取得する手順と、
それら取得された前記参照関係を組み合わせた情報に基づいて、前記第2の領域に移動すべき起点となるオブジェクトを検出する手順と、
検出された前記起点となるオブジェクトを前記第2の領域に移動させる手順と、
を前記計算機システムに実行させることを特徴とするメモリ管理プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2010/053477 WO2011104889A1 (ja) | 2010-02-25 | 2010-02-25 | 計算機システム、メモリ管理方法及びメモリ管理プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2010/053477 WO2011104889A1 (ja) | 2010-02-25 | 2010-02-25 | 計算機システム、メモリ管理方法及びメモリ管理プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
WO2011104889A1 true WO2011104889A1 (ja) | 2011-09-01 |
Family
ID=44506331
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
PCT/JP2010/053477 WO2011104889A1 (ja) | 2010-02-25 | 2010-02-25 | 計算機システム、メモリ管理方法及びメモリ管理プログラム |
Country Status (1)
Country | Link |
---|---|
WO (1) | WO2011104889A1 (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013128492A1 (ja) * | 2012-03-02 | 2013-09-06 | 株式会社日立製作所 | 計算機、プログラム及びメモリ管理方法 |
JP2013205911A (ja) * | 2012-03-27 | 2013-10-07 | Nec Corp | データ参照元特定システム及びその特定方法、並びにそのコンピュータ・プログラム |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003186737A (ja) * | 2001-12-14 | 2003-07-04 | Matsushita Electric Ind Co Ltd | ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム |
-
2010
- 2010-02-25 WO PCT/JP2010/053477 patent/WO2011104889A1/ja active Application Filing
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003186737A (ja) * | 2001-12-14 | 2003-07-04 | Matsushita Electric Ind Co Ltd | ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム |
Non-Patent Citations (1)
Title |
---|
MOTOKI KOHATA ET AL.: "Java ni Okeru Meijiteki Memory Kanri", TRANSACTIONS OF INFORMATION PROCESSING SOCIETY OF JAPAN RONBUNSHI JOURNAL, vol. 50, no. 7, 15 July 2009 (2009-07-15), pages 1693 - 1715 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013128492A1 (ja) * | 2012-03-02 | 2013-09-06 | 株式会社日立製作所 | 計算機、プログラム及びメモリ管理方法 |
JP5657169B2 (ja) * | 2012-03-02 | 2015-01-21 | 株式会社日立製作所 | 計算機、プログラム及びメモリ管理方法 |
JP2013205911A (ja) * | 2012-03-27 | 2013-10-07 | Nec Corp | データ参照元特定システム及びその特定方法、並びにそのコンピュータ・プログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5723208B2 (ja) | コールバックを用いたソフトウェアの動的計測のためのフェイルセーフメカニズム | |
US9582418B2 (en) | Confirming the sensitivity of a data object in a managed object heap | |
US9424082B2 (en) | Application startup page fault management in a hardware multithreading environment | |
US8443178B2 (en) | Operating system image shrinking apparatus and method and computer readable tangible medium storing a program for operating system image shrinking | |
JP2012084150A (ja) | 2パス自動アプリケーション計測 | |
US8438557B2 (en) | Reusing an application object | |
JP6179331B2 (ja) | ログ出力条件設定プログラム、装置、および方法 | |
US10768928B2 (en) | Software development work item management system | |
US8799716B2 (en) | Heap dump occurrence detection | |
US20180137002A1 (en) | Thread based dynamic data collection | |
JP5281452B2 (ja) | メモリ管理方法、コンピュータ、及び、メモリ管理プログラム | |
JP2011053862A (ja) | メモリ管理方法、計算機システム及びプログラム | |
WO2011104889A1 (ja) | 計算機システム、メモリ管理方法及びメモリ管理プログラム | |
US9165007B2 (en) | Log message optimization to ignore or identify redundant log messages | |
US10031840B2 (en) | Method of ascertaining primary cause of memory consumption in program, and computer system and computer program for the same | |
US20180173728A1 (en) | Information processing apparatus and method | |
US8806448B2 (en) | Dynamic instrumentation method and apparatus for tracing and analyzing a program | |
US9128851B2 (en) | Prefetching for multiple parent cores in a multi-core chip | |
JP5728979B2 (ja) | 情報処理装置、ソフトウェア検査方法およびソフトウェア検査プログラム | |
EP2960798B1 (en) | Automatic memory leak detection | |
JP4959781B2 (ja) | オブジェクト生成地点記録方法およびプログラム | |
JP5199975B2 (ja) | メモリ管理方法、メモリ管理プログラム、及び、情報処理装置 | |
JP2013105349A (ja) | 動的リンクライブラリの更新、実行方法 | |
JP6010961B2 (ja) | データ参照元特定システム及びその特定方法、並びにそのコンピュータ・プログラム | |
JP2009199391A (ja) | ガーベージコレクション方法及びその実施装置と処理プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
121 | Ep: the epo has been informed by wipo that ep was designated in this application |
Ref document number: 10846552 Country of ref document: EP Kind code of ref document: A1 |
|
NENP | Non-entry into the national phase |
Ref country code: DE |
|
122 | Ep: pct application non-entry in european phase |
Ref document number: 10846552 Country of ref document: EP Kind code of ref document: A1 |
|
NENP | Non-entry into the national phase |
Ref country code: JP |