JP4555879B2 - メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置 - Google Patents

メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置 Download PDF

Info

Publication number
JP4555879B2
JP4555879B2 JP2008207412A JP2008207412A JP4555879B2 JP 4555879 B2 JP4555879 B2 JP 4555879B2 JP 2008207412 A JP2008207412 A JP 2008207412A JP 2008207412 A JP2008207412 A JP 2008207412A JP 4555879 B2 JP4555879 B2 JP 4555879B2
Authority
JP
Japan
Prior art keywords
objects
program
lifetime
heap
class
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.)
Expired - Fee Related
Application number
JP2008207412A
Other languages
English (en)
Other versions
JP2010044532A (ja
Inventor
勝 泉
義人 川津
裕矢 岡井
浩一 岡田
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 JP2008207412A priority Critical patent/JP4555879B2/ja
Priority to US12/388,742 priority patent/US8504594B2/en
Publication of JP2010044532A publication Critical patent/JP2010044532A/ja
Application granted granted Critical
Publication of JP4555879B2 publication Critical patent/JP4555879B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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

Description

本発明は、メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置の技術に関する。
GC(Garbage Collection)は、メモリ上のヒープ領域に対するメモリ管理(特に、不要となった使用中のメモリ領域の開放)について、プログラムからの明示的な命令がされなくても、自動的に実現する技術である。なお、GCの起動は自動的に行われるため、リアルタイム処理などの重要な制御に対して、GCの負荷の影響を抑える方式も提案されている(非特許文献1、2参照)。
ヒープ領域は、内部ヒープまたは外部ヒープのいずれかに分類される。
内部ヒープは、GCの対象内となるヒープ領域であり、例えば、Java(登録商標)言語に実行されているJava(登録商標)ヒープとして実現される。
外部ヒープは、GCの対象外となるヒープ領域であり、プログラムからの明示的な命令(手動)により、メモリ管理が実現される。
GCを実現するためのアルゴリズムは、いくつか存在する。以下、2つのアルゴリズムを例示する。
「Mark and Sweep GC」アルゴリズムは、ヒープ領域上のプログラムのルートオブジェクトからリンクを順に辿り(Mark)、辿れなかった(宙に浮いた)オブジェクトをヒープ領域上から削除し(Sweep)、細切れのヒープ領域内のメモリ空間を一カ所に片づける(Compaction)アルゴリズムである。
「Copying GC」アルゴリズムでは、メモリ空間を複数の区画に区切り、GC監視対象のヒープ領域はそのうちの1つの区画のみとする。そして、オブジェクトからリンクを辿る処理を1つの区画内までに制限し、オブジェクト間がリンクで接続されるオブジェクト群の単位で、別の区画にコピー(Copying)するアルゴリズムである。
Angelo Corsaro and Ron K. Cytron著,"Efficient memory-reference checks for real-time java",Proceedings of the 2003 ACM SIGPLAN conference on Language, compiler, and tool for embedded systems,2003 F.Pizlo,J.M. Fox,D. Holmes and J.Vitek著,"Real-time Java scoped memory: design patterns and semantics",Proceedings of the Seventh IEEE International Symposium on Object-Oriented Real-Time Distributed Computing, 2004.
なお、Java(登録商標)言語のメモリ確保に関する技術として、長寿命となるオブジェクトを外部ヒープに確保することで、GCの実行に伴う負荷の増大を抑止する技術が存在する(例えば、特願2007−203288号公報を参照)。なお、オブジェクトの寿命とは、オブジェクトがメモリ上に生成されてから解放されるまでの期間の時間長を指す。
つまり、GCの処理対象となるオブジェクトの増加により、GCの処理負荷も増加する。そこで、長寿命の(換言すると、処理負荷への影響が大きい)オブジェクトをGCの処理対象となる内部ヒープではなく、GCの処理対象外となる外部ヒープに配置することにより、GCの処理対象となるオブジェクトを抑制し、GCの処理負荷も抑制する。
そして、短寿命のオブジェクトを内部ヒープに配置し、長寿命のオブジェクトを外部ヒープに配置するように振り分けることで、GCによる自動メモリ管理と、明示的な命令による手動メモリ管理と、のバランスをとることができる。
前記したオブジェクトの寿命に応じて、ヒープ領域を振り分ける手法を実現するときに、オブジェクトの寿命を計る処理は重要かつ困難な問題である。
実際にどのオブジェクトが長寿命となるかの判断を行うためにはオブジェクトのライフサイクルを考慮する必要があり、高度な知識が必要である。また、実行されるプログラムの利用状況、環境等によっても、オブジェクトが長寿命となるかが決まることも多い。
新たにプログラムを作成する際、どのオブジェクトが長寿命になるかを予め意識してプログラミングを行うことは、非常に困難なため、外部ヒープ領域を効果的に利用可能なプログラムの作成は困難である。
利用状況、環境等によって、オブジェクトが長寿命となるかが決まることも多く、ある利用状況で長寿命となったオブジェクトが、他の利用状況でも長寿命になるとは限らない。そのため、常に外部ヒープ領域に確保することで、GCの処理負荷の増大を抑止できるとは限らない。
そこで、本発明は、前記した問題を解決し、オブジェクトの寿命を計り、長寿命のオブジェクトをGCの対象外とすることで、オブジェクトを利用するプログラムを高速化することを、主な目的とする。
前記課題を解決するため、本発明は、オブジェクトの割当先となるメモリ上のヒープ領域を、GC(Garbage Collection)が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
メモリ管理方法を実行する計算機が、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置が、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
前記対象集合処理部が、
前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部が、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする。
その他の手段は、後記する。
本発明によれば、オブジェクトの寿命を計り、オブジェクトを適宜GCの対象外とすることで、オブジェクトを利用するプログラムを高速化することが可能になった。
以下、本発明の一実施形態に係る外部ヒープ適用支援装置(メモリ管理装置)を、適宜図面を参照しながら説明する。外部ヒープ適用支援装置は、オブジェクトの寿命に基づいて処理負荷の高いオブジェクトを選定し、その選定したオブジェクトをGCの対象外である外部ヒープ領域にメモリ割当することを特徴とする。
図1(a)は、メモリ振り分け手段を含む外部ヒープ適用支援装置が実現される計算機9の構成図を示す。
計算機9は、PCやサーバなどのコンピュータによって実現され、メモリ91、CPU(Central Processing Unit、処理部)92、記憶装置93、入力装置94、出力装置95およびこれらを相互接続するバス96を含んで構成される。
メモリ91は、オペレーティングシステム97に加え、実行対象プログラム10、対象集合処理部20、有制約集合処理部30、メモリ割当情報テーブル40(メモリ割当用データ)、プログラム実行部50、プログラム実行環境部60、集合用領域管理API(Application Programming Interface)70を含んで記憶している。
実行対象プログラム10は、Java(登録商標)言語などのオブジェクト指向言語で記述されるプログラムである。実行対象プログラム10のソースコードには、オブジェクト指向のクラスが記述されており、そのクラスが実行時にはヒープ領域上にオブジェクトとして具現化される。
実行対象プログラム10は、対象集合11を利用する。対象集合11は、有制約集合12および無制約集合13である(詳細は図3参照)。
対象集合11は、寿命が類似するオブジェクト群であり、有制約集合12と無制約集合13との総称である。
有制約集合12は、カプセル化された対象集合11であり、後記する5つの規約(第1規約〜第5規約)から構成される制約を満たす対象集合11である。
無制約集合13は、有制約集合12とは逆に、制約を満たさない対象集合11である。換言すると、無制約集合13は、対象集合11に属する有制約集合12の補集合である。
対象集合処理部20は、対象集合11(主に無制約集合13だが、有制約集合12でも可能)を試行し、その結果をメモリ割当情報テーブル40に書き込む。本実施形態において、「集合」とは、クラスから生成される1つ以上のオブジェクトの集合を指す。同じ集合に属する各オブジェクトは、利用(参照)関係にある。
有制約集合処理部30は、有制約集合12を試行し、その結果をメモリ割当情報テーブル40に書き込む。
メモリ割当情報テーブル40は、対象集合11ごとに、集合の生存期間(集合の寿命とも呼ばれる)などの試行結果を管理する(詳細は表2)。
プログラム実行部50は、実行対象プログラム10を実行する。このとき、実行対象プログラム10から利用される対象集合11は、ヒープ領域に割り当てられる。ここで、プログラム実行部50は、メモリ割当情報テーブル40の集合の生存期間から対象集合11が長寿命か短寿命かを判定し、その結果によって対象集合11の割当先となるヒープ領域を選択する。
プログラム実行環境部60は、例えば、Java(登録商標) VM(Virtual Machine)として実現されるプログラム実行部50の実行環境であり、オペレーティングシステム97上で実行される。
図1(b)は、図1(a)の計算機9に含まれる、プログラム実行部50およびプログラム実行環境部60の詳細を示す構成図である。
プログラム実行部50は、メモリ割当部51を有しており、メモリ割当部51は、ルートクラス配置部52、メンバクラス配置部53を有している。
ルートクラス配置部52は、対象集合11のルートクラスを、ヒープ領域(内部ヒープ62または外部ヒープ64)に配置する。なお、1つの対象集合11には、1つのルートクラスが含まれる。ルートクラスは、クラス間の利用関係をツリー構造として見たときのルート(根)に存在するクラスである。
メンバクラス配置部53は、対象集合11のメンバクラスを、ヒープ領域(内部ヒープ62または外部ヒープ64)に配置する。1つのルートクラスからは、1つ以上のメンバクラスが利用される。よって、1つの対象集合11には、1つ以上のメンバクラスが含まれる。
プログラム実行環境部60は、内部ヒープ処理部61、内部ヒープ62、外部ヒープ処理部63、外部ヒープ64、GC処理部65、オブジェクト情報取得部68、参照情報取得部69を有している。また、GC処理部65は、Copying GC部66とMark and Sweep GC部67を有している。
内部ヒープ処理部61は、内部ヒープ62を対象とするメモリ割当処理を担当し、外部ヒープ処理部63は、外部ヒープ64を対象とするメモリ割当処理を担当する。
内部ヒープ62とは、メモリ管理が自動で実行される(換言すると、GCの対象となる)ヒープ領域である。内部ヒープ62は、例えば、Java(登録商標)ヒープとして実現される。
外部ヒープ64とは、メモリ管理が手動で実行される(換言すると、GCの対象とならず、プログラム中から明示的にメモリ管理をする必要のある)ヒープ領域である。
よって、内部ヒープ62と外部ヒープ64との違いは、GCの対象となるか否かである。
内部ヒープ62に格納されるデータが多くなると、GCの対象となるため、メモリ管理は容易になる反面、GCの処理に伴う負荷が増大する。
外部ヒープ64に格納されるデータが多くなると、負荷はあまりかからないが、メモリ管理を手動で明示的に行う必要がある。
GC処理部65は、内部ヒープ62に対するGCを実行する。このGCのアルゴリズムにより、Copying GC方式を実行するCopying GC部66と、Mark and Sweep GC方式を実行するMark and Sweep GC部67と、が実行される。
オブジェクト情報取得部68および参照情報取得部69は、内部ヒープ62および外部ヒープ64上における対象集合11の各オブジェクトの割当状況を監視し、その結果として、オブジェクト情報取得部68はオブジェクトの割当履歴を、参照情報取得部69はオブジェクト間の参照関係を、それぞれ取得する。
集合用領域管理API70は、実行対象プログラム10から利用され、対象集合11の集合用領域を確保および解放する。
図2は、図1(a)の計算機9に含まれる、対象集合処理部20および有制約集合処理部30の詳細を示す構成図である。なお、各データ構造(各テーブル)の詳細は、後記する各表に示し、各処理部の詳細は、後記する各フローチャートに示す。
対象集合処理部20は、集合定義データ21(詳細は表3)および集合試行部22を有する。
集合試行部22は、集合オブジェクト解析部23と、集合解析部24と、集合ルートクラステーブル25(詳細は表4)と、集合メンバクラス候補テーブル26(詳細は表5)と、集合メモリ割当情報生成部27と、を有する。
有制約集合処理部30は、制約集合定義データ31(詳細は表6)と、制約形式検査部32と、制約試行部33と、を有する。
制約試行部33は、制約ルートクラス配置部34と、制約メンバクラス配置部35と、制約利用情報テーブル36(詳細は表7)と、制約メモリ割当情報生成部37と、を有する。
図3は、実行対象プログラム10から利用される対象集合11(有制約集合12および無制約集合13)のクラス構成の一例を示すクラス図である。
対象集合11は、ルートを成すオブジェクトを基点として参照関係を構築し、そのルートを成すオブジェクトの生存期間に他のオブジェクトの生存期間が包含される、オブジェクトの集合である。
ルートクラス(「RootClass」102)は、参照関係をツリー構造としたときのルートを成すクラスである。
メンバクラス(「MemberClass1」103、「MemberClass2」105、「MemberClass3」104)は、ルートクラスから参照される、ルートクラス以外のクラスである。
無制約集合13では、「RootClass」102にインタフェース101が付され、「MemberClass1」103にインタフェース106が付されており、外部のクラスからの利用を許可している。
クラス間の参照関係は、クラス間を接続する記号(菱形が付された直線)で示される。菱形があるクラスは、参照元のクラスである。例えば、「RootClass」102からは、「MemberClass1」103と、「MemberClass2」105とに、それぞれ参照されている。
なお、「RootClass」102からの塗られている菱形は、合成(Composition)を示し、参照元のオブジェクトの消去にともない、参照先のオブジェクトも消去する。
一方、塗られていない菱形は、集約(Aggregation)を示し、参照元のオブジェクトの消去は、参照先のオブジェクトの消去には影響しない。
有制約集合12は、対象集合11のうちの制約を満たすオブジェクトの集合である。その制約とは、有制約集合12のルートクラスのみが、有制約集合12以外のオブジェクトから利用できることである。具体的には、有制約集合12では、「RootClass」102のみがインタフェース101を提供している。有制約集合12に属さないオブジェクトは、有制約集合12内のインタフェースを提供しない各メンバクラスを利用することができない。
有制約集合12以外のオブジェクトからメンバクラスを利用すことができないため、ルートクラス(「RootClass」102)の消去にともない、すべてのメンバクラス(「MemberClass1」103、「MemberClass2」105、「MemberClass3」104)も消去する。
以下、有制約集合12の規約を具体化する。
「有制約集合12のルートクラスのみが、有制約集合12以外のオブジェクトから利用できる」という規約をJava(登録商標)言語に適用すると、以下の第1規約〜第5規約をすべて満たすときに規約に合格することになる。
・第1規約は、有制約集合12を構成するクラスはすべて同じパッケージ(package)107内に宣言しなければならないことである。
・第2規約は、有制約集合12のルートクラスは、第1規約で宣言されるパッケージ内において、publicクラスとして、1つだけ宣言しなければならないことである。
・第3規約は、有制約集合12のメンバクラスは、package-privateなクラスとして宣言しなければならないことである。
・第4規約は、有制約集合12のルートクラスのpublicと宣言されているメソッド(インタフェース101)は、戻り値としてメンバクラスを返してはいけないことである。
・第5規約は、有制約集合12のルートクラスのフィールド、有制約集合12のメンバクラスのフィールド、メソッド、コンストラクタは、publicと宣言してはいけないことである。
まず、5つの規約に従い定義されたプログラムは、対象集合11である。以下に各規約から導き出せる事項をもとに、その根拠を示す。
第5規約から、メンバクラスのオブジェクトを生成できるのは、同じパッケージであるルートクラスとメンバクラス内である。
第4規約からメンバクラスのオブジェクトは、有制約集合12以外のオブジェクトへは渡されないため、メンバクラスを保持できるのは、ルートクラスおよびメンバクラスである。したがって、メンバクラスの生存期間は、ルートクラスの生存期間に含まれる。
つまり、5つの規約に従い定義されたプログラムは、対象集合11である。
次に、5つの規約に従い定義されたプログラムは、有制約集合12のルートクラスのみが有制約集合12以外のオブジェクトから利用できるので、有制約集合12である。以下に各規約から導き出せる事項をもとに、その根拠を示す。
第3規約から、メンバクラスの型を有制約集合12以外のオブジェクトから利用することはできない。
第5規約から、メンバクラスのフィールド、メソッド、コンストラクタを有制約集合12以外のオブジェクトから利用することはできない。
第5規約から、メンバクラスのオブジェクトを生成できるのは、同じパッケージであるルートクラスとメンバクラス内である。
第4規約から、メンバクラスのオブジェクトは、有制約集合12以外のオブジェクトへは渡されない。
図4は、対象集合11の生存の様子を示す説明図である。
図4(a)は、クラス間の利用関係を矢印で示す図である。
「RootClass」は、対象集合11のルートクラスのオブジェクトである。「MemberClass1」、「MemberClass2」、「MemberClass3」は、対象集合11のメンバクラスのオブジェクトである。「OtherClass1」、「OtherClass2」は、対象集合11以外のオブジェクトである。対象集合11は、「RootClass」、「MemberClass1」、「MemberClass2」、「MemberClass3」により構成される。
図4(a)の矢印を順に追っていくことで、参照が辿れる。ここで、参照が辿れるとは、オブジェクトが直接参照しているオブジェクトを探し、その参照しているオブジェクトが参照しているオブジェクトを探す、というように再帰的にオブジェクトを探し、最終的に目的のオブジェクトを発見できることである。
図4(b)は、図4(a)の各クラスの割り当てに関する情報を示す表である。この表は、クラスごとに、そのクラス名と、割り当てられたクラスの領域サイズ(単位はB(Byte))と、クラスの割り当てられた時刻を示す生成時刻と、クラスの割り当てが解放された時刻を示す解放時刻と、を対応づける。クラスの寿命は、解放時刻と生成時刻との差分により求められる。
図5は、図4(a)のクラスごとに(「OtherClass2」は、省略)、クラスの寿命(生存期間)を示す図である。横方向に各クラスを配置し、縦方向は時間軸(下に行くほど時間が経過)を示す。そして、クラスごとにその生存期間を示す矩形が示されている。
例えば、ルートクラスである「RootClass」は、生成時刻が「10:00」であり、解放時刻が「10:20」であるので、寿命は20分である。
あるクラスの生成時刻がルートクラスの生成時刻以降であり、かつ、あるクラスの解放時刻がルートクラスの解放時刻以前であるときに、「あるクラスの生存期間が、ルートクラスの生存期間に包含される」と表現する。
例えば、各メンバクラス(「MemberClass1」、「MemberClass2」、「MemberClass3」)の生存期間は、それぞれルートクラスの生存期間に包含される。しかし、「OtherClass1」の生存期間は、ルートクラスの生存期間には包含されない。
なお、1つのルートクラスの生存期間内において、あるクラスの「生成および解放」が複数回実行されることもあるが、そのときには、あるクラスの複数回の生存期間がすべてルートクラスの生存期間に包含されるとき、包含関係を有することとする。
以下、図1(a)の計算機9に含まれる、各データ構造を表形式で説明する。
Figure 0004555879
表1は、対象集合11(有制約集合12)を記述するプログラムの一例を示す。このプログラムは、Java(登録商標)の文法に沿って、記述されている。
1行目は、パッケージ(package x)の宣言文である。
2,10,16,17行目は、それぞれクラス(RootClass、MemberClass1、MemberClass2、MemberClass3)の宣言文である。
RootClassは、ルートクラスであり、修飾子「public」が付されている。
MemberClass1、MemberClass2、MemberClass3は、それぞれメンバクラスであり、修飾子が省略されているため、package-private(自分のパッケージからのみ参照可能)なクラスである。
5〜8行目は、getDataメソッドを示す。このgetDataメソッドは、ルートクラスのpublicメソッドであり、戻り値としてメンバクラスを返さない。
3,4行目は、それぞれルートクラスのフィールド「m1」,「m2」を示す。
11,12行目は、それぞれメンバクラスのフィールド「i」,「m3」を示す。
13行目は、メンバクラスのコンストラクタ「MemberClass1」を示す。
14行目は、getメソッドを示す。このgetメソッドは、メンバクラスのメソッドであり、public宣言されていない。
以下に示すように、対象集合11は、5つの規約をすべて満たすため、有制約集合12である。
第1規約は、各クラスがpackage xに含まれるので、満たされる。
第2、3規約は、各クラスの修飾子の宣言または省略により、満たされる。
第4規約は、getDataメソッドの宣言により、満たされる。
第5規約は、ルートクラスのフィールド、メンバクラスのフィールド、コンストラクタ、getメソッドの宣言により、満たされる。
Figure 0004555879
表2は、メモリ割当情報テーブル40の一例を示す。メモリ割当情報テーブル40は、対象集合の名前と、ルートクラスと、メンバクラスと、ルートクラスの平均生存時間と、対象集合の平均領域サイズと、を対応づけて管理する。
「対象集合の名前」は、各レコードのキーとなる対象集合11の特定情報を示す。この対象集合11は、有制約集合12でもよいし、無制約集合13でもよい。
「ルートクラス」は、「対象集合の名前」の対象集合に含まれる1つのルートクラスを示す。
「メンバクラス」は、「対象集合の名前」の対象集合に含まれる1つ以上のメンバクラスを示す。
「ルートクラスの平均生存時間」は、「ルートクラス」に関する実行結果としての、平均生存時間を示す。この平均生存時間は、所定閾値との比較により、レコードの対象集合11が内部ヒープ62に割り当てられるか、外部ヒープ64に割り当てられるか、を決定するための情報である。
「対象集合の平均領域サイズ」は、「対象集合の名前」の対象集合に関する実行結果としての、割り当てられた平均領域サイズを示す。この平均領域サイズは、外部ヒープ64に割り当てられるときに外部ヒープ64内に確保される領域サイズの初期値として使用される。
Figure 0004555879
表3は、集合定義データ21の一例を示す。この集合定義データ21は、XMLの文法(要素タグの入れ子構造)に沿って、記述されている。
1〜11行目は、ルート要素であるtarget-set-definition要素を示す。
2〜5行目は、ルート要素の子要素であるtarget-set要素を示す。3行目のtarget-set-name要素は対象集合11の名称を示し、4行目のroot-class要素はその対象集合11のルートクラスの名称を示す。
6〜10行目は、2〜5行目と同様に、ルート要素の子要素であるtarget-set要素を示す。
Figure 0004555879
表4は、集合ルートクラステーブル25の一例を示す。集合ルートクラステーブル25は、対象集合11の名前と、その対象集合11に含まれるルートクラスと、ルートクラスの生成時刻と、ルートクラスの解放時刻と、ルートクラスの領域サイズと、メンバクラス候補テーブルIDと、を対応づけて管理する。「メンバクラス候補テーブルID」には、対応するルートクラスから利用されるメンバクラスのリストを格納する、集合メンバクラス候補テーブル26(表5)のテーブルを特定するためのIDが格納される。
Figure 0004555879
表5は、集合メンバクラス候補テーブル26の一例を示す。集合メンバクラス候補テーブル26は、集合ルートクラステーブル25(表4)のメンバクラス候補テーブルIDごとに、複数のテーブルに分割されて構成される。集合メンバクラス候補テーブル26は、メンバクラス候補と、その生成時刻と、その解放時刻と、その領域サイズと、を対応づけて管理する。
Figure 0004555879
表6は、制約集合定義データ31の一例を示す。この制約集合定義データ31は、集合定義データ21(表3)と同じ形式である。制約集合定義データ31は有制約集合12の定義情報を格納するのに対し、集合定義データ21は対象集合11(有制約集合12または無制約集合13)の定義情報を格納する。
1〜15行目は、ルート要素であるconstrained-set-definition要素を示す。
2〜8行目は、ルート要素の子要素であるconstrained-set要素を示す。3行目のconstrained-set-name要素は有制約集合12の名称を示し、4行目のroot-class要素はその有制約集合12のルートクラスの名称を示す。さらに、5〜7行目のmember-class要素は、その有制約集合12のメンバクラスの名称を示す。
9〜13行目は、2〜8行目と同様に、ルート要素の子要素であるconstrained-set要素を示す。
Figure 0004555879
表7は、制約利用情報テーブル36の一例を示す。集合ルートクラステーブル25(表4)との主な違いは、格納する情報が、対象集合11に関するものか(集合ルートクラステーブル25)、有制約集合12に限定したものか(制約利用情報テーブル36)である。
制約利用情報テーブル36は、有制約集合12の名前と、その有制約集合12に含まれるルートクラスの生成時刻と、ルートクラスの解放時刻と、有制約集合12の領域サイズと、有制約集合12の妥当性と、を対応づけて管理する。
なお、「有制約集合12の領域サイズ」とは、有制約集合12のルートクラスおよびメンバクラスのオブジェクトが占める領域サイズを示す。また、「有制約集合の妥当性」は、有制約集合12の利用方法が妥当である(妥当)か、否か(不当)を示す。
Figure 0004555879
表8は、対象集合11(有制約集合12も含む)を利用する実行対象プログラム10の一例を示す。このプログラムは、Java(登録商標)の文法に沿って、記述されている。
5行目は、newInstanceメソッドを利用して、メモリアロケータのインスタンスを生成する旨を示す。
7行目は、allocateメソッドを利用して、引数で指定したルートクラスを含む対象集合用領域を割り当てて、対象集合の利用を開始する旨を示す。
9行目は、getRootメソッドを利用して、対象集合のルートクラスを取得する旨を示す。
11行目は、取得した対象集合のルートクラスを利用して、任意の操作を実行する旨を示す。
13行目は、9行目で取得した対象集合のルートクラスへの参照をクリアする旨を示す。
15行目は、releaseメソッドを利用して、引数で指定した対象集合用領域を解放して、対象集合の利用を終了する旨を示す。
Figure 0004555879
表9は、対象集合11(無制約集合13)を利用する実行対象プログラム10に関する解析用プログラムの一例を示す。このプログラムは、Java(登録商標)の文法に沿って、記述されている。
以下、表9と表8との違いに着目して、説明する。
5行目では、内部ヒープ62内に対象集合11のルートクラスを生成する。対象集合用領域の確保および解放する旨を明示しない。
Figure 0004555879
表10は、集合用領域管理API70の一例を示す。集合用領域管理API70は、表8の実行対象プログラム10から利用され、対象集合11(有制約集合12も含む)の集合用領域を確保および解放する。
1〜9行目は、MemoryAllocatorクラスを宣言する。MemoryAllocatorクラスは、対象集合11(有制約集合12も含む)の集合用領域を確保および解放するメモリアロケータである。4行目のnewInstanceメソッドにより、メモリアロケータのインスタンスが生成され、6行目のallocateメソッドにより、引数で指定されたルートクラスを含む集合用領域が割り当てられ、8行目のreleaseメソッドにより、allocateメソッドで割り当てられた集合用領域が解放される。
10〜14行目は、TargetSetAreaインタフェースを宣言する。TaretSetAreaインタフェースは、MemoryAllocatorクラスからアクセスされる集合用領域を規定する。13行目で宣言されるgetRootメソッドは、6行目のallocateメソッドの呼び出し時に引数として指定されるルートクラスのオブジェクトを取得するメソッドである。
図6は、計算機9が実行する処理の概要を示すフローチャートである。計算機9は、このフローチャートから、図7以降のフローチャートをサブルーチンとして呼び出す。
S11において、計算機9は、入力装置94を介して、実行対象プログラム10から利用される無制約集合13を記述する集合定義データ21と、実行対象プログラム10から利用される有制約集合12を記述する制約集合定義データ31と、の入力を受け付ける。
S12において、計算機9は、S11で入力された集合定義データ21および制約集合定義データ31から、利用される対象集合11が有制約集合12か、無制約集合13かを判定する。制約集合定義データ31に記述された有制約集合12ならS31へ、集合定義データ21に記述された無制約集合13ならS21へ、それぞれ移行する。
S21において、計算機9は、実行対象プログラム10に関する解析用プログラムの入力を受け付ける。なお、S21の解析用プログラムと、S23で入力される実行対象プログラム10とは、利用される対象集合11が互いに同じである。解析用プログラムは、利用される対象集合11を意識することなく記述されている。一方、実行対象プログラム10には、解析用プログラムの試行(後記するS22)の結果を示す記述が追加され、集合用領域管理API70による対象集合11の集合用領域を確保および解放する旨が記述される。
S22において、集合試行部22は、解析用プログラムを実行(試行)し、その結果をメモリ割当情報テーブル40に登録する。そのため、集合試行部22は、図11のフローチャートを実行する。なお、図11からの処理において、集合試行部22は、S21で入力される解析用プログラムに、S11で入力される集合定義データ21で指定されたルートクラスを含む対象集合11が存在するか否かを、特定する。
S23において、計算機9は、無制約集合13を利用する実行対象プログラム10の入力を受け付ける。実行対象プログラム10は、集合用領域管理API70による無制約集合13の明示的なメモリ管理を、解析用プログラムに追加したプログラムである。
解析用プログラムのルートクラス生成(表9の5行目)を、解析用プログラムの試行の結果(図11のS506で後記)から特定された無制約集合13の対象集合用領域の割り当て(表8の7行目、allocate)と、ルートクラスの取得(表8の5行目、getRoot)とに変更する。
無制約集合13の任意の操作(表9の7行目)の次に、ルートクラスへの参照のクリア(表8の13行目)と、割り当てた対象集合用領域の解放(表8の15行目、release)とを追加する。
S31において、計算機9は、有制約集合12を利用する実行対象プログラム10の入力を受け付ける。
S32において、制約形式検査部32は、S31で入力された実行対象プログラム10が、S11で入力された制約集合定義データ31が示すように、利用される対象集合11が有制約集合12か否かを形式検査する。そのため、制約形式検査部32は、図15のフローチャートを実行する。
S33において、制約試行部33は、S32の形式検査に合格した実行対象プログラム10を実行(試行)し、その結果をメモリ割当情報テーブル40に登録する。そのため、制約試行部33は、図18のフローチャートを実行する。
S41において、プログラム実行部50は、S22またはS33で登録されたメモリ割当情報テーブル40の内容に従って、実行対象プログラム10を実行(運用)する。そのため、プログラム実行部50は、図7のフローチャートを実行する。このとき、プログラム実行部50のメモリ割当部51は、実行対象プログラム10から利用される対象集合11(有制約集合12および無制約集合13)の生存期間(寿命)をメモリ割当情報テーブル40から読み取って、所定閾値と比較することで対象集合11が長寿命か短寿命かを判定し、長寿命の場合には外部ヒープ64に対象集合用領域を割り当てるとともに、その対象集合用領域内に対象集合11を配置し、短寿命の場合には内部ヒープ62に対象集合11を配置する。
以上図6の各処理において、以下に示す各オブジェクトのうち、処理負荷の高いオブジェクトを外部ヒープ64に待避させることにより、計算機9の処理性能の低下を抑制することができる。
・既存プログラム(解析用プログラム)から利用されるオブジェクト(S21,S22,S23)
・新規プログラム(実行対象プログラム10)から利用されるオブジェクト(S31,S32,S33)
なお、図6の処理では、S11で集合定義データ21および制約集合定義データ31の入力を受け付け、S12でその利用される集合をもとに分岐するようにすることで、1台の計算機9が2種類の対象集合11(無制約集合13、有制約集合12)を選択して扱えるようにした。一方、1台の計算機9が1種類の対象集合11を専用で扱うように構成してもよく、そのときには、制約集合定義データ31の入力(S11)およびその分岐(S12)を省略することができる。
図7は、プログラム実行部50が運用する、実行対象プログラム10の処理を示すフローチャートである。このフローチャートは、図6のS41から呼び出されて実行される。なお、実行対象プログラム10は、有制約集合12を利用するプログラムでもよいし、無制約集合13を利用するプログラムでもよい。
S101において、メモリ割当情報テーブル40から、S22およびS33で登録されたメモリ割当情報を取得する。
S102において、プログラム実行環境部60上で、実行対象プログラム10の実行を開始する。
S103において、実行中の実行対象プログラム10からallocateメソッドが実行されると、S104に移行する。
S104において、対象集合用領域を割り当てるとともに、その対象集合用領域内に、ルートクラスを生成する。つまり、allocateメソッドの引数で渡されたルートクラスの名称を引数として、図8を呼び出す。なお、図8では、プログラム実行部50は、ルートクラス配置部52に対して、ルートクラスの生成を指示する。指示を受けたルートクラス配置部52は、対象集合11が長寿命のときには外部ヒープ64内に対象集合用領域を割り当てるとともに、その対象集合用領域内にルートクラスを生成し、対象集合11が短寿命のときには内部ヒープ62内にルートクラスを生成する。
S105において、実行対象プログラム10のreleaseメソッドが実行されると、S106に移行する。
S106において、allocateメソッドで割り当てられた対象集合用領域を解放する。つまり、releaseメソッドの引数で渡され、S104で割り当てられた対象集合用領域を引数として、図9を呼び出す。図9では、プログラム実行部50は、ルートクラス配置部52に対して、対象集合用領域の解放を指示する。指示を受けたルートクラス配置部52は、外部ヒープ64内に割り当てた対象集合用領域を、解放する。
S107において、プログラム実行環境部60のCopying GC部66の処理で内部ヒープ62のNew領域のオブジェクトがOld領域への移動対象となると、S108に移行する。
S108において、S107で移動対象となるメンバクラスのオブジェクトをS104で外部ヒープ64内に割り当てた対象集合用領域へ移動する。つまり、移動対象のオブジェクトを引数として、図10を呼び出す。プログラム実行部50は、メンバクラス配置部53に対して、対象集合が長寿命の場合、メンバクラスのオブジェクトを外部ヒープ6464内に割り当てた対象集合用領域へ移動するように指示する。
図8は、ルートクラス配置部52が実行する、対象集合11の領域割当処理を示すフローチャートである。本フローチャートは、S104から呼び出されて実行されるサブルーチンであり、その引数にはルートクラスの名称が渡される。
S201において、引数で渡されたルートクラスの名称が、S101で取得したメモリ割当情報テーブル40のルートクラス列に登録されているか否かを判定する。登録されている場合(S201,Yes)、そのメモリ割当情報テーブル40のレコードを登録レコードとして、S202からの処理を実行する。
S202において、Mark and Sweep GC部67から、Mark and Sweep GCの実行間隔を取得する。
S203において、登録レコードの「平均生存時間」が、取得したMark and Sweep GCの実行間隔以上か否かを判定する。S203の判定を満たすときには、S204に移行する。
S204において、登録レコードの「対象集合の平均領域サイズ」に従って、外部ヒープ処理部63を用いて外部ヒープ64内に対象集合用領域を割り当てるとともに、その対象集合用領域内に引数で渡されたルートクラスを生成する。
S205において、(S201,No)または(S203,No)の場合、内部ヒープ処理部61を用いて、内部ヒープ62の中に引数で渡されたルートクラスを生成する。
図9は、ルートクラス配置部52が実行する、対象集合11の領域解放処理を示すフローチャートである。本フローチャートは、S106から呼び出されて実行されるサブルーチンであり、その引数には解放対象の対象集合11が渡される。
S301において、引数で渡された対象集合11が、外部ヒープ64に割り当てられているか、否か(内部ヒープ62に割り当てられている)を判定する。なお、(S301,No)の場合、内部ヒープ62に割り当てられている対象集合11は、GC処理部65によりGCのアルゴリズムに従って解放される。S301の判定を満たすときには、S302に移行する。
S302において、外部ヒープ処理部63を用いて、引数で渡された対象集合11が配置されている対象集合用領域を外部ヒープ64から解放する。
図10は、メンバクラス配置部53が実行する、オブジェクトの移動処理を示すフローチャートである。本フローチャートは、S108から呼び出されて実行されるサブルーチンであり、その引数には移動対象のオブジェクトが渡される。
S401において、allocateメソッドにより外部ヒープ64に配置されたルートクラスのオブジェクトから、引数で渡された移動対象のオブジェクトへの参照が辿れるか、Copying GC部66へ問い合わせる。S401の判定を満たすときには、S402に移行する。
S402において、引数で渡された移動対象のオブジェクトが、S401のルートクラスを含む対象集合のメンバクラスのオブジェクトであるか判定する。S402の判定を満たすときには、S403に移行する。
S403において、引数で渡された移動対象のオブジェクトを、S401のルートクラスのオブジェクトが格納されている外部ヒープ64内の対象集合用領域へ移動する。
図11は、集合試行部22が実行する、プログラムの試行処理を示すフローチャートである。本フローチャートは、図6のS22から呼び出されるサブルーチンである。
S501において、集合試行部22は、S11で入力された集合定義データ21を読み込む。
S502において、集合オブジェクト解析部23は、S21の解析用プログラムをプログラム実行環境部60上で試行する。
S503において、集合オブジェクト解析部23は、参照情報取得部69を介して、試行した解析用プログラムに利用されたすべてのオブジェクトの参照関係を取得するとともに、オブジェクト情報取得部68を介して、利用されたすべてのオブジェクトの割当履歴を取得する。
まず、図4(a)からは、以下に示すオブジェクトの参照関係が取得される。
・参照「RootClass→MemberClass1」
・参照「RootClass→MemberClass2」
・参照「MemberClass1→MemberClass3」
・参照「MemberClass2→OtherClass2」
・参照「OtherClass1→OtherClass2」
次に、図4(b)は、取得されるオブジェクトの割当履歴として、すべてのオブジェクト(RootClass、MemberClass1、MemberClass2、MemberClass3、OtherClass1、OtherClass2)の領域サイズと、生成時刻と、解放時刻と、を示している。
S504において、集合解析部24は、集合オブジェクト解析部23でのオブジェクト解析の結果から、対象集合11を解析する。そのため、図12に示すサブルーチンを呼び出す。
S505において、集合メモリ割当情報生成部27は、集合解析部24による対象集合11の解析結果から、対象集合11のメモリ割当情報を生成し、そのメモリ割当情報をメモリ割当情報テーブル40に登録する。そのため、図14に示すサブルーチンを呼び出す。
S506において、集合試行部22は、集合メモリ割当情報生成部27によるメモリ割当情報の生成結果から、メモリ割当情報テーブル40に登録した「対象集合」、「ルートクラス」、「メンバクラス」をユーザに出力する。
図12は、集合解析部24が実行する、対象集合11の解析処理を示すフローチャートである。本フローチャートは、S504から呼び出されるサブルーチンである。
S601〜S606において、S11で入力された集合定義データ21を参照し、各target-set要素内のroot-class要素を選択するループを実行する。
S602において、S503で取得したオブジェクトの割当履歴から、ループで選択されているroot-class要素で定義されたルートクラスから生成される全オブジェクトの割当履歴を選択し(図4では「RootClass」)、その選択した情報を集合ルートクラステーブル25のルートクラスに関する列へ格納する。
S603〜S605において、S602の全オブジェクトを1つずつ選択するループを実行する。
S604において、S603からのループで選択したオブジェクトについて、その対象集合のメンバクラスの候補を解析する。そのため、図13に示すサブルーチンを呼び出す。
図13は、集合解析部24が実行する、対象集合のメンバクラス候補の解析処理を示すフローチャートである。本フローチャートは、S604から呼び出されるサブルーチンである。
S701において、S503で取得したオブジェクトの参照関係から、S603〜S605のループで選択されているルートクラスのオブジェクトが参照するすべてのオブジェクトを取得する。ここで、ルートクラスのオブジェクトが直接参照するオブジェクトだけではなく、ルートクラスのオブジェクトから辿れるすべてのオブジェクトを取得する。図4で示した例では、集合解析部24は、参照情報取得部69から、「MemberClass1、MemberClass2、MemberClass3、OtherClass2」を取得する。
S702〜S706において、S701で取得したすべてのオブジェクトに対して、1つずつ選択するループを実行する。
S703において、S503で取得したオブジェクトの割当履歴から、S702〜S706のループで選択中のオブジェクトの割当履歴を取得する。
S704において、取得した割当履歴の生成時刻および解放時刻で示される生存区間が、S603〜S605のループで選択されているルートクラスの生成時刻と解放時刻で示される生存区間に包含されるか否かを判定する。S704の判定を満たすときにはS705に移行する。
S705において、S702〜S706のループで選択中のオブジェクトの割当履歴を、集合メンバクラス候補テーブル26のメンバクラスの候補に関する列に格納する。
例えば、図4のRootClassの生存区間に包含される(S704,Yes)MemberClass1、MemberClass2、MemberClass3の割当履歴を、それぞれメンバクラスの候補として、集合メンバクラス候補テーブル26(ID=#1)へ格納する。
一方、図4のRootClassの生存区間に包含されない(S704,No)OtherClass2の割当履歴は、集合メンバクラス候補テーブル26には格納されない。
なお、OtherClass2は、図4のRootClass以外のルートクラスがS603〜S605のループで選択されているときに、その選択されているルートクラスのうちの少なくとも1つのルートクラスの生存区間に包含されるときには、別の集合メンバクラス候補テーブル26(例えば、ID=#2)に格納される。
図14は、集合メモリ割当情報生成部27が実行する、メモリ割当情報テーブル40の登録処理を示すフローチャートである。本フローチャートは、S505から呼び出されるサブルーチンである。
S801〜S808において、集合解析部24による対象集合11の解析処理(S504)で作成された集合ルートクラステーブル25の各ルートクラスを1つずつ選択して、以下のループ処理を実行する。以下、選択したルートクラスごとに、メモリ割当情報テーブル40の追加するレコードを作成する。
S802において、追加するレコードの「対象集合」列には、選択されたルートクラスの属する対象集合を登録する。
S803において、追加するレコードの「ルートクラス」列には、選択されたルートクラスを登録する。
S804において、集合メンバクラス候補テーブル26を参照して、追加するレコードの「メンバクラス」列を生成する。具体的には、以下の(1)〜(3)の処理を実行する。
(1)集合ルートクラステーブル25の「ルートクラス」列から、選択されたルートクラスを検索する。
(2)検索したレコードに含まれる、集合ルートクラステーブル25の「メンバクラス候補テーブルID」の全てを抽出する。
(3)抽出した「メンバクラス候補テーブルID」に一致する全ての集合メンバクラス候補テーブル26の中で、「メンバクラス候補」列に格納されている要素を、追加するレコードのメンバクラスとして全て抽出する。(なお、抽出した「メンバクラス候補テーブルID」に一致するいずれかの集合メンバクラス候補テーブル26の中で、「メンバクラス候補」列に格納されている要素を、追加するレコードのメンバクラスとして全て抽出してもよい。)
S805において、追加するレコードの「ルートクラスの平均生存時間」列を生成する。具体的には、S804の(1)で検索したレコードに含まれる、「メンバクラス候補の生成時刻」および対応する「メンバクラス候補の解放時刻」の組ごとに、時刻の差分を計算することにより1回分の生存時間を計算し、その生存時間の平均値を選択されたルートクラスの平均生存時間とする。
S806において、追加するレコードの「対象集合の平均領域サイズ」列を生成する。つまり、選択されたルートクラスのサイズと、抽出したメンバクラスのサイズとから、対象集合の領域サイズの平均領域サイズを算出する。具体的には、対象集合ごとに、対象集合のルートクラスのサイズを集合ルートクラステーブル25の「ルートクラスの領域サイズ」列から読み取り、対象集合のメンバクラスのサイズを集合メンバクラス候補テーブル26の「メンバクラス候補の領域サイズ」列から読み取り、加算することにより対象集合の領域サイズを求める。そして、おのおの求めた対象集合の領域サイズの平均値を計算する。
S807において、S802〜S806でそれぞれ生成された、追加するレコードの各列要素を、メモリ割当情報テーブル40に書き込む。
図15は、制約形式検査部32が実行する、有制約集合12の制約の形式(第1規約〜第5規格の全て)を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、図6のS32から呼び出されるサブルーチンであり、実行対象プログラム10から利用される集合を示す制約集合定義データ31(S11で入力される)が、検査対象の制約集合定義データ31として引数指定される。
S901において、検査対象の制約集合定義データ31で示される各集合を読み取る。
S902〜S909において、読み取った各集合から1つずつ検査対象の集合を選択し、集合を検査するループを実行する。
S903において、検査対象の集合のルートクラスを検査対象のルートクラスに指定して、ルートクラスを検証するサブルーチン(図16)を呼び出す。
S904において、S903のルートクラスの検証結果が「妥当」であるか否かを判定する。S904の判定を満たすときにはS905へ移行し、判定を満たさないときにはS911へ移行する。
S905〜S908において、検査対象の集合のメンバクラスを制約集合定義データ31から1つずつ選択し、メンバクラスを検証するループ処理を実行する。
S906において、選択されているメンバクラスを検査対象のメンバクラスに指定して、メンバクラスを検証するサブルーチン(図17)を呼び出す。
S907において、S906のメンバクラスの検証結果が「妥当」であるか否かを判定する。S907の判定を満たすときにはS908へ移行し、判定を満たさないときにはS911へ移行する。
S910において、検査対象の集合すべてについて、ルートクラスの検証結果がすべて「妥当」(S904,Yes)かつメンバクラスの検証結果がすべて「妥当」(S907,Yes)なら、検査対象の制約集合定義データ31を「妥当」として、処理を終了する。
S911において、検査対象の集合のうちの1つ以上の集合について、ルートクラスの検証結果が「不当」(S904,No)またはメンバクラスの検証結果が1つでも「不当」(S907,No)なら、検査対象の制約集合定義データ31を「不当」として、処理を終了する。
なお、S904またはS907の判定ですべて「妥当」と判定された検査対象の集合は、有制約集合12である。一方、S904またはS907の判定で1回でも「不当」と判定された検査対象の集合は、無制約集合13であるか、または対象集合11以外である。
図16は、制約形式検査部32が実行する、ルートクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、S903から呼び出されるサブルーチンである。
S1001において、制約集合定義データ31に定義された検査対象のルートクラスのプログラムが、S31で入力された実行対象プログラム10内に存在するか否かを判定する。S1001の判定を満たすときにはS1002へ移行し、判定を満たさないときにはS1008へ移行する。
S1002において、S31で入力された実行対象プログラム10内に存在する、検査対象のルートクラスのプログラムが、publicクラスであるか否かを判定する。S1002の判定を満たすときにはS1003へ移行し、判定を満たさないときにはS1008へ移行する。
S1003において、検査対象のルートクラスのプログラムが、publicフィールドを含むか否かを判定する。S1003の判定を満たすときにはS1008へ移行し、判定を満たさないときにはS1004へ移行する。
S1004〜S1006において、検査対象のルートクラスのプログラムの各publicメソッドを1つずつ順に選択するループを実行する。このループを終えた後は、S1007に移行する。
S1005において、選択されたpublicメソッドの戻り値が、検査対象のルートクラスと同じパッケージのクラスであるか否かを判定する。S1005の判定を満たすときにはS1008へ移行し、判定を満たさないときにはS1006へ移行する。
S1007において、検査対象のルートクラスを「妥当」と判断する。
S1008において、検査対象のルートクラスを「不当」と判断する。
なお、有制約集合の第4規約に反する事例として、選択されたpublicメソッドの戻り値が、当該ルートクラスと異なるパッケージで(S1005,No)、かつメンバクラスのスーパークラスであり、また当該publicメソッドがメンバクラスを戻り値として返す場合には、第4規約に反するものの、例外処理として「妥当」と判断することとしてもよい。そして、第4規約に反するこの場合の妥当性は、S06での有制約集合を利用するJava(登録商標)プログラムの試行時、制約試行部33の制約ルートクラス配置部34(図20のS1404で後記)により検証される。
図17は、制約形式検査部32が実行する、メンバクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、S906から呼び出されるサブルーチンである。
S1101において、制約集合定義データ31に定義された検査対象のメンバクラスのプログラムが、S31で入力された実行対象プログラム10内に存在するか否かを判定する。S1101の判定を満たすときにはS1102へ移行し、判定を満たさないときにはS1108へ移行する。
S1102において、S31で入力された実行対象プログラム10内に存在する、検査対象のメンバクラスのプログラムが、ルートクラスと同じパッケージに含まれるか否かを判定する。S1102の判定を満たすときにはS1103へ移行し、判定を満たさないときにはS1108へ移行する。
S1103において、検査対象のメンバクラスのプログラムにpublicフィールドが存在するか否かを判定する。S1101の判定を満たすときにはS1108へ移行し、判定を満たさないときにはS1104へ移行する。
S1104〜S1106において、検査対象のメンバクラスのプログラムの各メソッドおよび各コンストラクタを1つずつ選択するループを実行する。このループを実行した後は、S1107に移行する。
S1105において、選択されたメソッドまたはコンストラクタが、public宣言されているか否かを判定する。S1105の判定を満たすときにはS1108へ移行する。
S1107において、検査対象のメンバクラスを「妥当」と判断する。
S1108において、検査対象のメンバクラスを「不当」と判断する。
図18は、制約試行部33が実行する、プログラムの試行処理を示すフローチャートである。本フローチャートは、図6のS33から呼び出されるサブルーチンである。
S1201において、制約試行部33は、S11で入力された制約集合定義データ31を読み込む。
S1202において、制約試行部33は、有制約集合12を利用する実行対象プログラム10をプログラム実行環境部60上で試行する。この試行結果の各データを制約利用情報テーブル36に格納する。なお、S1202の試行処理は、プログラム実行部50の運用処理(図7)と類似する。以下が試行処理と運用処理との相違点である。
(1)allocateメソッドにより呼び出される割当処理のサブルーチンが、運用処理の場合(ルートクラス配置部52が実行する図8)から、試行処理の場合(制約ルートクラス配置部34が実行する図19)に置き換わる。
(2)releaseメソッドにより呼び出される解放処理のサブルーチンが、運用処理の場合(ルートクラス配置部52が実行する図9)から、試行処理の場合(制約ルートクラス配置部34が実行する図20)に置き換わる。
(3)プログラム実行環境部60のCopying GC部66の処理で内部ヒープ62のNew領域のオブジェクトがOld領域への移動対象となるときに呼び出される移動処理のサブルーチンは、双方ともに図10の処理であるが、その動作主体が、運用処理の場合(メンバクラス配置部53)から、試行処理の場合(制約メンバクラス配置部35)に置き換わる。
(4)前記(1)〜(3)の3つのサブルーチンの処理対象となる対象集合11が割り当てられるヒープ領域は、運用処理の場合(対象集合11の寿命の長さにより外部ヒープ64または内部ヒープ62のいずれかに振り分けられる)から、試行処理の場合(有制約集合12の寿命の長さに関わらず、外部ヒープ64となる)に置き換わる。
S1203において、制約メモリ割当情報生成部37は、制約利用情報テーブル36に格納されたS1202の試行結果からメモリ割当情報を生成し、そのメモリ割当情報をメモリ割当情報テーブル40に登録する。そのため、図21に示すサブルーチンを呼び出す。
図19は、制約ルートクラス配置部34が実行する、有制約集合12の領域割当処理を示すフローチャートである。本フローチャートは、S1202の(1)から呼び出されるサブルーチンである。なお、図8の割当処理との主な違いは、内部ヒープ62に割り当てずに警告すること(S1302)と、割当結果を制約利用情報テーブル36に登録すること(S1304)である。
S1301において、allocateメソッドの引数で渡されたルートクラスが含まれる有制約集合12が、制約集合定義データ31に定義されているか否かを判定する。S1301の判定を満たすときにはS1303へ移行し、判定を満たさないときにはS1302へ移行する。
S1302において、有制約集合12が定義されていない旨をユーザに警告し、処理を中断する。
S1303において、外部ヒープ処理部63を用いて、外部ヒープ64内に集合用領域を生成し、その集合用領域内にallocateメソッドの引数で渡されたルートクラスを生成する。
S1304において、制約利用情報テーブル36にレコードを追加し、ルートクラスの生成時刻を登録する。
図20は、制約ルートクラス配置部34が実行する、有制約集合12の領域解放処理を示すフローチャートである。本フローチャートは、S1202の(2)から呼び出されるサブルーチンである。なお、図9の解放処理との主な違いは、制約利用情報テーブル36に解放結果を登録することである。
S1401において、外部ヒープ処理部63を用いて、外部ヒープ64内の集合用領域を解放する。この集合用領域を解放することで、この集合用領域内のルートクラスも併せて解放される。
S1402において、制約利用情報テーブル36に、ルートクラスの解放時刻を登録する。
S1403において、外部ヒープ処理部63から、S1401での解放時の集合用領域の領域サイズを取得し、制約利用情報テーブル36に、有制約集合の領域サイズとして登録する。有制約集合12を利用する実行対象プログラム10の実行中、有制約集合のルートクラスおよびメンバクラスは外部ヒープ64内の集合用領域に配置される。ルートクラスおよびメンバクラスの配置において、集合用領域に空きがなくなった場合、外部ヒープ処理部63は集合用領域を自動的に拡張する。そのため、解放時の集合用領域の領域サイズは、有制約集合のルートクラスおよびメンバクラスが占める領域サイズと同じである。
S1404において、外部ヒープ64内の集合用領域の解放時、内部ヒープ62に配置されているオブジェクトから、外部ヒープ64に配置されている有制約集合のルートクラスおよびメンバクラスへの参照があったか、外部ヒープ処理部63へ問い合わせる。そして、その問い合わせ結果により、分岐する。S1404の判定を満たすとき(参照あり)にはS1405へ移行し、判定を満たさないとき(参照なし)にはS1406へ移行する。
以下に、S1404において各クラスへの参照の有無を判断する具体例を列挙する。
・実行対象プログラム10の文「this.root = null;」を実行しない結果、有制約集合のルートクラスへの参照をクリアしていない場合、内部ヒープ62に配置されているオブジェクトから、外部ヒープ64に配置されているルートクラスへの参照が存在する。
・図16で説明した第4規約に関する例外処理において、ルートクラスのpublicメソッドの戻り値が、当該ルートクラスと異なるパッケージで、かつメンバクラスのスーパークラスであり、また当該publicメソッドがメンバクラスを戻り値として返す場合、内部ヒープ62に配置されているオブジェクトから、外部ヒープ64に配置されているメンバクラスへの参照が存在する。
S1405において、制約利用情報テーブル36内の「有制約集合12の妥当性」列を「妥当」に更新する。
S1406において、制約利用情報テーブル36内の「有制約集合12の妥当性」列を「不当」に更新する。
図21は、制約メモリ割当情報生成部37が実行する、メモリ割当情報テーブル40の登録処理を示すフローチャートである。本フローチャートは、S1203から呼び出されるサブルーチンである。図14の登録処理との主な違いは、有制約集合12の妥当性をチェックすることと、対象集合11の解析結果(統計情報)を用いる代わりに、有制約集合12の試行結果を用いてメモリ割当情報テーブル40の追加するレコードを生成することである。
S1501〜S1509において、制約利用情報テーブル36の「有制約集合の名前」ごとに、1つ以上のレコードを選択するループを実行する。以下、1回のループごとに、メモリ割当情報テーブル40の追加するレコードを1レコード分作成する。
1回のループにおいて、制約利用情報テーブル36から1つのレコードが選択されるときには、そのレコードの「有制約集合の名前」は、制約利用情報テーブル36内に1つ存在する。
1回のループにおいて、制約利用情報テーブル36から複数のレコードが選択されるときには、そのレコードの「有制約集合の名前」は、選択される複数のレコード間で同じである。
S1502において、選択したレコードの「有制約集合の妥当性」列がすべて「妥当」か否かを判定する。S1502の判定を満たすときにはS1504へ移行し、判定を満たさないときにはS1503へ移行する。
S1503において、現在のループで処理中の有制約集合12のメモリ割当情報を生成するか否かをユーザに問い合わせる。S1503の判定を満たすときにはS1504へ移行する。
S1504において、追加するレコードの「対象集合」列には、今回のループで選択された「有制約集合の名前」を登録する。
S1505において、追加するレコードの「ルートクラス」列および「メンバクラス」列を生成する。そのために、現在のループで処理中の制約利用情報テーブル36の「有制約集合の名前」と一致する、制約集合定義データ31(表6参照)の「constrained-set-name要素」を検索する(例えば3,10行目)。
追加するレコードの「ルートクラス」列には、検索された要素内のroot-class要素(例えば4,11行目)が登録される。
追加するレコードの「メンバクラス」列には、検索された要素内のmember-class要素(例えば5〜7,12行目)が登録される。
S1506において、追加するレコードの「ルートクラスの平均生存時間」列を生成する。具体的には、制約利用情報テーブル36の選択したレコードに含まれる、「ルートクラスの生成時刻」および対応する「ルートクラスの解放時刻」の時刻の差分を計算することにより1レコード分の生存時間を計算する。1回のループで複数のレコードが同じ制約集合の名称のために選択されているときには、その複数のレコードを構成する各レコードについて生存時間を計算し、その生存時間の平均値を「ルートクラスの平均生存時間」とする。
S1507において、追加するレコードの「対象集合の平均領域サイズ」列を生成する。具体的には、制約利用情報テーブル36の選択したレコードに含まれる「有制約集合の領域サイズ」の平均値を「ルートクラスの平均生存時間」とする。
S1508において、S1504〜S1507でそれぞれ生成された、追加するレコードの各列要素を、メモリ割当情報テーブル40に書き込む。
以上説明した本実施形態によれば、実行対象プログラム10が利用する対象集合11のメモリ割当先について、その対象集合11を構成するオブジェクトの寿命に基づいて、内部ヒープ62または外部ヒープ64に振り分ける。
これにより、短寿命のオブジェクトは、その生成処理と解放処理とが頻繁になされるが、内部ヒープ62に割り当てられるため、そのメモリ管理はGCにより自動的に行われる。よって、GCにより、メモリ管理の手間を効率的に削減できる。
一方、長寿命のオブジェクトは外部ヒープ64に割り当てられるため、GCの対象外となり、GCの処理負荷を削減できる。さらに、長寿命のオブジェクトは、その生成処理と解放処理とが行われる頻度が少ないため、実行対象プログラム10で明示的にメモリ管理したとしても、メモリ管理の手間はそれほどかからなくて済む。
よって、本実施形態のメモリ管理手法は、内部ヒープ62および外部ヒープ64それぞれの長所を、バランスよく活用できる手法である。
本発明の一実施形態に関するメモリ振り分け手段を含む外部ヒープ適用支援装置が実現される計算機9を示す構成図である。 本発明の一実施形態に関する対象集合処理部20および有制約集合処理部30の詳細を示す構成図である。 本発明の一実施形態に関する実行対象プログラム10から利用される対象集合11のクラス構成の一例を示すクラス図である。 本発明の一実施形態に関する対象集合11の生存の様子を示す説明図である。 本発明の一実施形態に関するクラスの寿命(生存期間)を示す説明図である。 本発明の一実施形態に関する計算機9が実行する処理の概要を示すフローチャートである。 本発明の一実施形態に関するプログラム実行部50が運用する、実行対象プログラム10の処理を示すフローチャートである。 本発明の一実施形態に関するルートクラス配置部52が実行する、対象集合11の領域割当処理を示すフローチャートである。 本発明の一実施形態に関するルートクラス配置部52が実行する、対象集合11の領域解放処理を示すフローチャートである。 本発明の一実施形態に関するメンバクラス配置部53が実行する、オブジェクトの移動処理を示すフローチャートである。 本発明の一実施形態に関する集合試行部22が実行する、プログラムの試行処理を示すフローチャートである。 本発明の一実施形態に関する集合解析部24が実行する、対象集合11の解析処理を示すフローチャートである。 本発明の一実施形態に関する集合解析部24が実行する、対象集合のメンバクラス候補の解析処理を示すフローチャートである。 本発明の一実施形態に関する集合メモリ割当情報生成部27が実行する、メモリ割当情報テーブル40の登録処理を示すフローチャートである。 本発明の一実施形態に関する制約形式検査部32が実行する、有制約集合12の制約の形式(第1規約〜第5規格の全て)を満たしているか否かをチェックする処理を示すフローチャートである。 本発明の一実施形態に関する制約形式検査部32が実行する、ルートクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。 本発明の一実施形態に関する制約形式検査部32が実行する、メンバクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。 本発明の一実施形態に関する制約試行部33が実行する、プログラムの試行処理を示すフローチャートである。 本発明の一実施形態に関する制約ルートクラス配置部34が実行する、有制約集合12の領域割当処理を示すフローチャートである。 本発明の一実施形態に関する制約ルートクラス配置部34が実行する、有制約集合12の領域解放処理を示すフローチャートである。 本発明の一実施形態に関する制約メモリ割当情報生成部37が実行する、メモリ割当情報テーブル40の登録処理を示すフローチャートである。
符号の説明
10 実行対象プログラム
11 対象集合
12 有制約集合
13 無制約集合
20 対象集合処理部
21 集合定義データ
22 集合試行部
23 集合オブジェクト解析部
24 集合解析部
25 集合ルートクラステーブル
26 集合メンバクラス候補テーブル
27 集合メモリ割当情報生成部
30 有制約集合処理部
31 制約集合定義データ
32 制約形式検査部
33 制約試行部
34 制約ルートクラス配置部
35 制約メンバクラス配置部
36 制約利用情報テーブル
37 制約メモリ割当情報生成部
40 メモリ割当情報テーブル
50 プログラム実行部
51 メモリ割当部
52 ルートクラス配置部
53 メンバクラス配置部
60 プログラム実行環境部
61 内部ヒープ処理部
62 内部ヒープ
63 外部ヒープ処理部
64 外部ヒープ
65 GC処理部
66 Copying GC部
67 Mark and Sweep GC部
68 オブジェクト情報取得部
69 参照情報取得部
70 集合用領域管理API
9 計算機
91 メモリ
92 CPU
93 記憶装置
94 入力装置
95 出力装置
96 バス
97 オペレーティングシステム

Claims (8)

  1. オブジェクトの割当先となるメモリ上のヒープ領域を、GC(Garbage Collection)が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
    メモリ管理方法を実行する計算機は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
    前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
    前記対象集合処理部は、
    前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
    オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
    前記プログラム実行部は、
    前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
    生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
    前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
    メモリ管理方法。
  2. オブジェクトの割当先となるメモリ上のヒープ領域を、GC(Garbage Collection)が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
    メモリ管理方法を実行する計算機は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、有制約集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
    前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す制約集合定義データと、の入力を受け付け、
    前記有制約集合処理部は、
    前記実行対象プログラムを試行することにより、その実行対象プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
    前記実行対象プログラムを読み取り、その実行対象プログラム内の各クラスの定義文で記述されるアクセス修飾子を参照することにより、所定規約を満たすか否かを判定し、
    前記所定規約は、オブジェクトの集合のうちのルートクラスについてのオブジェクトはオブジェクトの集合の外部から利用できるが、オブジェクトの集合のうちのルートクラス以外のメンバクラスについてのオブジェクトはオブジェクトの集合の外部から利用できない旨の規約であり、
    オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記制約集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
    前記プログラム実行部は、
    前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
    生成されるオブジェクトを利用する前記実行対象プログラムが、前記所定規約を満たさないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
    前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
    メモリ管理方法。
  3. 前記有制約集合処理部は、前記実行対象プログラムを試行する過程において、前記外部ヒープに配置されているオブジェクトを解放するときに、その解放するオブジェクトが前記内部ヒープに配置されているオブジェクトから参照されている場合、解放するオブジェクトの属するオブジェクトの集合を妥当性無しとし、
    前記プログラム実行部は、
    前記生成されるオブジェクトの属するオブジェクトの集合が、妥当性無しとされたときには、前記生成されるオブジェクトを前記内部ヒープに配置すること、を特徴とする
    請求項2に記載のメモリ管理方法。
  4. 前記プログラム実行部は、前記実行対象プログラムを実行する過程で、前記内部ヒープに配置されているオブジェクトに対してCopyingGC処理を実行した結果、前記内部ヒープ内での領域移動が行われるオブジェクトを抽出し、
    抽出したオブジェクトの集合の寿命が長寿命の場合、そのオブジェクトの集合のうちのメンバクラスについてのオブジェクトの配置先を、前記内部ヒープから前記外部ヒープに移動すること、を特徴とする
    請求項1ないし請求項3のいずれか1項に記載のメモリ管理方法。
  5. 前記メモリ割当用データには、前記試行処理におけるオブジェクトの集合を生成したときの平均領域サイズを、さらに、オブジェクトの集合の名前と対応づけ、
    前記プログラム実行部は、前記外部ヒープに配置するためのオブジェクトの領域サイズを、前記メモリ割当用データから読み取った平均領域サイズとすること、を特徴とする
    請求項1ないし請求項4のいずれか1項に記載のメモリ管理方法。
  6. 請求項1ないし請求項5のいずれか1項に記載のメモリ管理方法を、コンピュータに実行させるためのメモリ管理プログラム。
  7. オブジェクトの割当先となるメモリ上のヒープ領域を、GC(Garbage Collection)が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理装置であって、
    メモリ管理装置は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
    前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
    前記対象集合処理部は、
    前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
    オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
    前記プログラム実行部は、
    前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
    生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
    前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
    メモリ管理装置。
  8. オブジェクトの割当先となるメモリ上のヒープ領域を、GC(Garbage Collection)が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理装置であって、
    メモリ管理装置は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、有制約集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
    前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す制約集合定義データと、の入力を受け付け、
    前記有制約集合処理部は、
    前記実行対象プログラムを試行することにより、その実行対象プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
    前記実行対象プログラムを読み取り、その実行対象プログラム内の各クラスの定義文で記述されるアクセス修飾子を参照することにより、所定規約を満たすか否かを判定し、
    前記所定規約は、オブジェクトの集合のうちのルートクラスについてのオブジェクトはオブジェクトの集合の外部から利用できるが、オブジェクトの集合のうちのルートクラス以外のメンバクラスについてのオブジェクトはオブジェクトの集合の外部から利用できない旨の規約であり、
    オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記制約集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
    前記プログラム実行部は、
    前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
    生成されるオブジェクトを利用する前記実行対象プログラムが、前記所定規約を満たさないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
    前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
    メモリ管理装置。
JP2008207412A 2008-08-11 2008-08-11 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置 Expired - Fee Related JP4555879B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2008207412A JP4555879B2 (ja) 2008-08-11 2008-08-11 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置
US12/388,742 US8504594B2 (en) 2008-08-11 2009-02-19 Memory management method, and memory management apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008207412A JP4555879B2 (ja) 2008-08-11 2008-08-11 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置

Publications (2)

Publication Number Publication Date
JP2010044532A JP2010044532A (ja) 2010-02-25
JP4555879B2 true JP4555879B2 (ja) 2010-10-06

Family

ID=41697396

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008207412A Expired - Fee Related JP4555879B2 (ja) 2008-08-11 2008-08-11 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置

Country Status (2)

Country Link
US (1) US8504594B2 (ja)
JP (1) JP4555879B2 (ja)

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4555879B2 (ja) * 2008-08-11 2010-10-06 株式会社日立製作所 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置
US8631051B2 (en) * 2008-09-22 2014-01-14 Filip Pizlo Hybrid fragmenting real time garbage collection
JP5199975B2 (ja) * 2009-10-13 2013-05-15 株式会社日立製作所 メモリ管理方法、メモリ管理プログラム、及び、情報処理装置
JP5618796B2 (ja) * 2010-12-02 2014-11-05 株式会社日立製作所 計算機、計算機の制御方法及びプログラム
US10754766B2 (en) 2014-03-21 2020-08-25 Red Hat Israel, Ltd. Indirect resource management
US9507713B1 (en) * 2014-09-22 2016-11-29 Google Inc. Memory object pretenuring
US9430153B2 (en) * 2014-10-22 2016-08-30 International Business Machines Corporation Garbage collection and other management of memory heaps
US11726979B2 (en) 2016-09-13 2023-08-15 Oracle International Corporation Determining a chronological order of transactions executed in relation to an object stored in a storage system
US10733159B2 (en) 2016-09-14 2020-08-04 Oracle International Corporation Maintaining immutable data and mutable metadata in a storage system
US10860534B2 (en) 2016-10-27 2020-12-08 Oracle International Corporation Executing a conditional command on an object stored in a storage system
US10956051B2 (en) 2016-10-31 2021-03-23 Oracle International Corporation Data-packed storage containers for streamlined access and migration
US10169081B2 (en) * 2016-10-31 2019-01-01 Oracle International Corporation Use of concurrent time bucket generations for scalable scheduling of operations in a computer system
US10180863B2 (en) 2016-10-31 2019-01-15 Oracle International Corporation Determining system information based on object mutation events
US9934127B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of key frames for replay responsiveness
US9940369B1 (en) 2017-03-08 2018-04-10 Microsoft Technology Licensing, Llc Searching an indexed time-travel trace
US10185645B2 (en) 2017-03-08 2019-01-22 Microsoft Technology Licensing, Llc Resource lifetime analysis using a time-travel trace
US9934126B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of reverse lookup data structures
US9959194B1 (en) 2017-03-08 2018-05-01 Microsoft Technology Licensing, Llc Indexing a trace by insertion of memory snapshots for replay responsiveness
US9983978B1 (en) 2017-03-08 2018-05-29 Microsoft Technology Licensing, Llc Querying an indexed time-travel trace
US10282274B2 (en) 2017-06-14 2019-05-07 Microsoft Technology Licensing, Llc Presenting differences between code entity invocations

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001184219A (ja) * 1999-12-27 2001-07-06 Matsushita Electric Ind Co Ltd コンパイル装置、コンパイル方法、コンパイルプログラムを記録している記録媒体、プログラム実行装置及びプログラム実行システム。
JP2003241967A (ja) * 2002-02-15 2003-08-29 Matsushita Electric Ind Co Ltd プログラム実行装置およびその方法、並びにそこで実行されるプログラム
US6681234B2 (en) * 2000-12-12 2004-01-20 Sun Microsystems, Inc. Method and apparatus for storing long-lived objects in a virtual machine

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6199075B1 (en) * 1997-05-30 2001-03-06 Sun Microsystems, Inc. Method and apparatus for generational garbage collection of a heap memory shared by multiple processors
JP3027845B2 (ja) * 1997-11-21 2000-04-04 オムロン株式会社 プログラム制御装置および方法
US7162499B2 (en) * 2000-06-21 2007-01-09 Microsoft Corporation Linked value replication
US6795836B2 (en) * 2000-12-29 2004-09-21 International Business Machines Corporation Accurately determining an object's lifetime
US20030097537A1 (en) * 2001-10-23 2003-05-22 Sun Microsystems, Inc. Method and apparatus for scoped memory
US6728738B2 (en) * 2002-04-03 2004-04-27 Sun Microsystems, Inc. Fast lifetime analysis of objects in a garbage-collected system
US20070011109A1 (en) * 2005-06-23 2007-01-11 Microsoft Corporation Immortal information storage and access platform
WO2008107482A1 (en) * 2007-03-07 2008-09-12 Coloplast A/S Scaffolds for the regeneration of cartilage
US7882159B2 (en) * 2007-07-25 2011-02-01 Apple Inc. Associative references in a garbage collected programming environment
JP4555879B2 (ja) * 2008-08-11 2010-10-06 株式会社日立製作所 メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001184219A (ja) * 1999-12-27 2001-07-06 Matsushita Electric Ind Co Ltd コンパイル装置、コンパイル方法、コンパイルプログラムを記録している記録媒体、プログラム実行装置及びプログラム実行システム。
US6681234B2 (en) * 2000-12-12 2004-01-20 Sun Microsystems, Inc. Method and apparatus for storing long-lived objects in a virtual machine
JP2003241967A (ja) * 2002-02-15 2003-08-29 Matsushita Electric Ind Co Ltd プログラム実行装置およびその方法、並びにそこで実行されるプログラム

Also Published As

Publication number Publication date
US20100049938A1 (en) 2010-02-25
JP2010044532A (ja) 2010-02-25
US8504594B2 (en) 2013-08-06

Similar Documents

Publication Publication Date Title
JP4555879B2 (ja) メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置
JP6939132B2 (ja) アプリケーション・プロファイリング・ジョブ管理システム、プログラム、及び方法
US9465726B2 (en) Abstract layer for automatic user interface testing
CN103809966B (zh) 数据流分析方法和装置
US8995070B2 (en) Garbage collection based on functional block size
JP6695437B2 (ja) 管理計算機及びテスト環境決定方法
US9904524B2 (en) Method and device for visually implementing software code
KR101751515B1 (ko) 테스트 실행 장치, 방법 및 컴퓨터 프로그램
JP5031470B2 (ja) メモリ管理方法、情報処理装置及びメモリ管理プログラム
CN107257959A (zh) 托管代码中的垃圾收集控制
JP2022036800A (ja) Api選定システム及びapi選定方法
CN105849698B (zh) 动态编程中的执行防护
JP5304950B2 (ja) データベース管理方法、データベース管理装置及びデータベース管理プログラム
US20190253473A1 (en) Checkpointing a set of stream computing data
KR102631906B1 (ko) 폐기물 수거 운송차 배차 방법, 장치 및 시스템
US9335990B2 (en) Method, a system, and a non-transitory computer-readable medium for supporting application development
KR101566855B1 (ko) 전사적 자원 관리 시스템에서의 새로운 업무용 화면을 개발하는 방법
US10992742B2 (en) Managing asset placement with respect to a distributed computing environment having a set of hosts
JP5199975B2 (ja) メモリ管理方法、メモリ管理プログラム、及び、情報処理装置
Menshchikov Scalable semantic virtual machine framework for language-agnostic static analysis
US20180137049A1 (en) Mutable type builder
JP2015084152A (ja) データ割当制御プログラム、MapReduceシステム、データ割当制御装置、データ割当制御方法
CN112328180A (zh) 一种基于单片机的文件管理方法
Lee Automatic Measurement of Function Points from Java Applications
Castrillón Mazo et al. Sequential Code Flow

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100217

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: 20100706

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: 20100716

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

Free format text: PAYMENT UNTIL: 20130723

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 4555879

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees