JP4711269B2 - メモリ電力制御方法及びメモリ電力制御プログラム - Google Patents
メモリ電力制御方法及びメモリ電力制御プログラム Download PDFInfo
- Publication number
- JP4711269B2 JP4711269B2 JP2008298335A JP2008298335A JP4711269B2 JP 4711269 B2 JP4711269 B2 JP 4711269B2 JP 2008298335 A JP2008298335 A JP 2008298335A JP 2008298335 A JP2008298335 A JP 2008298335A JP 4711269 B2 JP4711269 B2 JP 4711269B2
- Authority
- JP
- Japan
- Prior art keywords
- garbage collection
- heap
- memory
- heap area
- power control
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
- G06F12/0276—Generational garbage collection
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1028—Power efficiency
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
- Power Sources (AREA)
Description
本発明は、メモリの消費電力を削減するためのメモリ電力制御方法及びメモリ電力制御プログラムに関し、特に、世代別ヒープメモリにおけるメモリ電力制御方法及びメモリ電力制御プログラムに関する。
一般に、省エネルギー(省電力)の観点からパソコン等のコンピュータにおける消費電力の削減が大きな課題となっている。コンピュータにおいては、メモリによる消費電力がCPUの1.5倍に達し、更に、データセンター全体で考えると、メモリの消費電力はその27%に達すると言われている(非特許文献1)。このため、省エネルギーの観点から見ると、メモリ消費電力の削減は極めて重要な事項である。
ところで、省電力に対応したメモリモジュールは所謂省電力モードを有しており、物理メモリのアドレス空間を固定サイズで分割した単位(ランクという)で省電力モードを切り替えているものの、ヒープメモリ(ヒープ領域)とガベージコレクション(garbage collection:GC(ゴミ集め))とを活用したプログラムにおいては、省電力モードを利用しづらいということがある。
オブジェクト指向言語とGCの普及に応じて、プログラムはより大きなヒープ領域を必要としており、オブジェクト指向言語においては、データを表現するオブジェクトがヒープ領域内に記憶領域(メモリ領域)を割り当てられ、GCは未使用のオブジェクトのメモリ領域を解放しつつ再利用する。そして、GCの実行はプログラムにとってはオーバーヘッド、すなわち当該プログラム処理の所要時間が増加することによる実質的な当該プログラム性能の低下となるため、GCが頻繁に発生しないようにするためにはヒープ領域を大きくする必要がある。
また、サーバ・アプリケーション等の大規模でしかも性能が重視されるプログラムにおいては、ギガバイト(GB)のオーダーでメモリ領域を使用し短い期間(ナノ秒からマイクロ秒)の期間しか生き残らないオブジェクトが多いということが実験結果によって知られている。
一方、コンピュータにおいて、メモリの消費電力をその使用状況に応じて削減するため、メモリが、その電源が独立に制御される複数のメモリバンクを有し、各メモリバンクが複数の物理ページを備えて、利用頻度が同程度である物理ページを同一のメモリバンクに集め、利用頻度に基づいて電源を制御する対象となるメモリバンクを選択して、選択されたメモリバンクの電源を制御するようにしたものがある(例えば、特許文献1参照)。
特開2008−40606号公報
Li,X. et al, "Performance-directed energy management for storage systems", IEEE Micro, 2004
ところで、上述の点を考慮すると、割り当てによってアクセスを行うオブジェクトは、メモリアドレス空間上に偏在し、その領域はヒープ領域のアドレス空間中で高速に移動することになる。従って、頻繁にアクセスするオブジェクトは、特定のランクに集まっておらず、全ランクがアクセスされ続けることになって、省電力モードとするためには性能の低下が避けられないという課題がある。
また、特許文献1に記載の手法では、オペレーティング・システム(OS)がページに対するアクセス統計を生成し、このアクセス統計に応じて同程度のアクセス頻度を有するページを物理メモリ上で収集して、結果的にアクセスされないページを特定のランクに置くようにしているが、アクセス統計の生成及びメモリコピー等がGCと同様に処理の所要時間を増加させてプログラムの性能を低下する原因となってしまう。また、アクセスされる領域が高速に移動する場合には、統計頻度的にメモリ全体が均等にアクセスされているように観測される結果、ランクを省電力モードにすることが極めて難しいという課題がある。
従って、本発明の目的は、ヒープ領域とGCを用いた際においても、従来技術に係るプログラムの性能低下を起こすことなく、省電力モードを実行することのできるメモリ電力制御方法及びメモリ電力制御プログラムを提供することにある。
本発明は、上記課題に鑑み、以下のような解決手段を提供する。
(1)本発明は、省電力モードを備えるメモリを備え、不要となったオブジェクトをまとめて回収するガベージコレクションが動作するコンピュータで用いられ、前記メモリのアドレス空間を所定の固定サイズで分割したメモリブロックに前記オブジェクトが割り当てられ、前記メモリの電力制御を行うためのメモリ電力制御方法であって、前記コンピュータが、前記メモリ上のヒープ領域を複数のサブヒープ領域に分割して管理する第1のステップと、前記ガベージコレクションの所用時間と予め規定された目標値との大小関係に基づいて前記サブヒープ領域の数を動的に変更する第2のステップとを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、サブヒープ領域の数を動的に変更するようにしたので、ガベージコレクションが動作するコンピュータにおいても性能低下を起こすことなく、省電力モードを実行することができる。
(2)本発明は、(1)に記載のメモリ電力制御方法において、前記第1のステップは、前記メモリブロックのうちで前記電力制御のタイミングが同一であるメモリブロック毎にサブヒープ領域を生成するものである。
これにより、本発明に係るメモリ電力制御方法では、メモリブロック毎に電力制御を容易に行うことができる。
(3)本発明は、(1)に記載のメモリ電力制御方法において、前記第2のステップは、更に前記ガベージコレクションの発生頻度に基づくものである。
これにより、本発明に係るメモリ電力制御方法では、ガベージコレクションの発生頻度が高くなるに従って適切なサブヒープ数を増し、逆に発生頻度が低くなるに従って適切なサブヒープ数を減らす動作を実行することができる。従って、メモリアクセスに起因する消費電力を低減できる。
(4)本発明は、(1)に記載のメモリ電力制御方法において、前記コンピュータは、予め規定された期間を越えて生存してアクセスされるオブジェクトを生存オブジェクトとし、当該生存オブジェクト及びそのクラスをオブジェクト・アクセスの状況を示すアクセスプロファイルで識別する第3のステップと、前記ガベージコレクションを実行する際に、前記生存オブジェクトを予め定められたサブヒープ領域に集める第4のステップを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、生存オブジェクトを予め定められたサブヒープ領域に集めてガベージコレクションを実行するようにしたので、メモリアクセスに起因する消費電力を低減できる。
(5)本発明は、(4)に記載のメモリ電力制御方法において、前記ガベージコレクションが世代別ガベージコレクションであり、前記ヒープ領域がヤングヒープ領域及びオールドヒープ領域に分割され、前記オブジェクトが前記ヤングヒープ領域から割り当てられており、前記ガベージコレクションは前記ヤングヒープ領域に使い尽くされた場合には、前記ヤングヒープ領域のみの前記ガベージコレクションを行うマイナーガベージコレクションを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、ヤングヒープ領域のみのガベージコレクションを行うことが可能になるので、メモリアクセスに起因する消費電力を低減できる。
(6)本発明は、(5)に記載のメモリ電力制御方法において、前記コンピュータは、予め定められた回数以上前記マイナーガベージコレクションを行った際にも生存するオブジェクトを前記オールドヒープ領域に移動する第5のステップを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、オールドヒープ領域へのオブジェクト移動を用い、変更の頻度の低い内容を保持するメモリに対する消費電力を低減することができる。
(7)本発明は、(6)に記載のメモリ電力制御方法において、前記ガベージコレクションは前記オールドヒープ領域を使い果たした場合に前記ヒープ領域の全てについてガベージコレクションを行うフルガベージコレクションを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、ガベージコレクションを、オールドヒープ領域を使い果たした場合にヒープ領域の全てについて実行するようにしたので、ヒープ領域全てについてガベージコレクションを行う回数を低減でき、その結果、メモリの消費電力を低減することができる。
(8)本発明は、(7)に記載のメモリ電力制御方法において、前記コンピュータは、前記フルガベージコレクションが行われるに当たって、前記オールドヒープ領域にある生存オブジェクトを前記オールドヒープ領域の所定のサブヒープ領域に集める第6のステップを実行するものである。
これにより、本発明に係るメモリ電力制御方法では、フルガベージコレクションの際のメモリアクセスが低減される結果、メモリの消費電力を低減することができる。
(9)本発明は、省電力モードを備えるメモリを備え、不要となったオブジェクトをまとめて回収するガベージコレクションが動作するコンピュータで用いられ、前記メモリのアドレス空間を所定の固定サイズで分割したメモリブロックに前記オブジェクトが割り当てられ、前記メモリの電力制御を行うためのメモリ電力制御方法であって、前記コンピュータが、前記メモリ上のヒープ領域を複数のサブヒープ領域に分割して管理する第1のステップと、前記ガベージコレクションの所用時間と予め規定された目標値との大小関係に基づいて前記サブヒープ領域の数を動的に変更する第2のステップと、予め規定された期間を越えて生存してアクセスされるオブジェクトを生存オブジェクトとし、当該生存オブジェクト及びそのクラスをオブジェクト・アクセスの状況を示すアクセスプロファイルで識別する第3のステップと、前記ガベージコレクションを実行する際に、前記生存オブジェクトを予め定められたサブヒープ領域に集める第4のステップと、前記ガベージコレクションは世代別ガベージコレクションであり、前記ガベージコレクションはマイナーガベージコレクション及びフルガベージコレクションを含み、前記ヒープ領域はヤングヒープ領域及びオールドヒープ領域に分割され、前記オブジェクトは前記ヤングヒープ領域から割り当てられており、前記ガベージコレクションは前記ヤングヒープ領域によって使い尽くされた場合には、前記ヤングヒープ領域のみの前記ガベージコレクションを行う前記マイナーガベージコレクションを実施し、前記ガベージコレクションは前記オールドヒープ領域を使い果たした場合に前記ヒープ領域の全てについて前記フルガベージコレクションを実施し、予め定められた回数以上前記マイナーガベージコレクションを行った際にも生存するオブジェクトを前記オールドヒープ領域に移動する第5のステップと、前記フルガベージコレクションが行われるに当たって、前記オールドヒープ領域にある生存オブジェクトを前記オールドヒープ領域の所定のサブヒープ領域に集める第6のステップと、を実行するものである。
これにより、本発明に係るメモリ電力制御方法では、ガベージコレクションが動作するコンピュータに、上述の第1のステップから第6のステップを実行させると共に、当該ガベージコレクションの動作を世代別ガベージコレクションとして、ヤングヒープ領域に対するマイナーガベージコレクション及びオールドヒープ領域の欠乏に基づくガベージコレクションを組み合わせることができる。これにより、世代別ガベージコレクションの状況に基づいてメモリアクセスに起因する消費電力を低減できる。
(10)本発明に係るメモリ電力制御方法は、任意のコンピュータ可読媒体を用いて記憶され得るコンピュータ・プログラムとして提供できる。
以上のように、本発明によれば、メモリ上のヒープ領域を複数のサブヒープ領域に分割して管理し、ガベージコレクションの所用時間と予め規定された目標値との大小関係に基づいてサブヒープ領域の数を動的に変更するようにしたので、ガベージコレクションが動作するコンピュータにおいても性能低下を起こすことなく、確実に省電力モードを実行して、メモリ消費電力を低減できるという効果がある。
以下、本発明の実施形態について図を参照しながら説明する。図1は、本発明の実施の形態によるメモリ電力制御方法が用いられるコンピュータ・システムの一例を示す図である。
図1において、オペレーティング・システム(OS)11は、中央演算装置(CPU)上で動作し、仮想マシン(例えば、Java Vertual Machine:VM)12と相互に通信を行う。物理メモリ13はそのアドレス空間が固定サイズで分割された複数の単位(ランク)13−1〜13−M(Mは2以上の整数)を有している。図示の例では、ヒープメモリ(ヒープ領域)14が複数のサブヒープ領域14−1〜14−L(Lは2以上の整数)に分割されてプロセス空間に存在し、このヒープ領域14は、後述するようにして、VM12を介して、エネルギーコントローラ15によって制御される。
図1に示すコンピュータ・システムでは、ガベージコレクション(GC)が動作しており、メモリモジュールは省電力対応メモリであり、所謂省電力モードを有している。つまり、図1に示すコンピュータ・システムは、不要となったオブジェクトを後でまとめて回収するGC方式で動作するコンピュータ・システムである。
図2は初期化を説明するためのフロー図であり、OS11は物理アドレス空間がどのようにランク13−1〜13−Mに分割されるかを示す情報として、ハードウェアからランクサイズR及びページサイズPを取得する(S201、以下、フロー図に含まれる各ステップを同様にSで始まる符号を用いて表す)。
いま、各ランク13−1〜13−MのサイズをそれぞれRバイトとすると、例えば、物理アドレスの29〜31番目のビット(0番目が最下位ビット)がランクを示すアドレスマッピングであれば、アドレス空間上、512MB毎にランクが切り替わることになる(図3参照)。前述のように、ランクサイズRは512MBであるから、4GBの物理メモリ13は8つのランク13−1〜13−8を有することになる。
OS11は、上述のようにして取得したランクサイズRを用いて、ランク毎に物理メモリ13を管理する。例えば、ランクサイズRが512MBで、ページサイズPが2MBであるとき、各ランクには256ページが存在し、OS11は256ページの各々について未使用またはプロセス空間にマップされているか否かを管理する。つまり、図4に示すように、ランク0〜ランク7の8つのランクがある際、ランク0では、ページ0、ページ1等がマップされ、ページ2等がマップされていないことになる。同様にして、ランク1〜7についても同様にして各ページがマップされているか否かが管理される。
更に、OS11は、特別なシステムコールSC(Syscall)を提供して、指定するランク番号に属するページを、指定するプロセス空間のページにマップする。つまり、各ランクに対するメモリマッピングテーブルを生成する(S202)。
ところで、ヒープ領域を初期化する際には、VM12は電力管理を行いたいプロセス空間のヒープ領域14を複数のサブヒープ領域14−1〜14−Lに分割して管理する。サブヒープ領域14−1〜14−Lの数は、ランクの数に対応しており、8つのランクを有する際には、L=8である。そして、VM12は、システムコールSCを呼び出して、各サブヒープ領域14−1〜14−8にそれぞれランク13−1〜13−8のページをマップする。すなわち、システムコールによってサブヒープに特定のランクのページをマップする(S203)。従って、図5に示すように、8つのサブヒープ0〜7は、図4と同様に、ページがマップされることになる。
ここで、図1から明らかなように、使用するサブヒープ領域14−1〜14−Lの数が多い程多数のランクを使用することになるから、電力消費量が多くなる。コンピュータ・システムに対する負荷が最高である(例:CPUの利用率が100%)場合に、全てのサブヒープ領域(全ランク)14−1〜14−Lが使用されているとして、コンピュータ・システムの負荷が低減した場合について説明する。
一般に、負荷が半分になれば、ヒープ領域を消費する速度も半分になる。GCを用いるコンピュータ・システムでは、消費速度が半分になっても全てのヒープ領域を使い続けることになって、メモリの消費電力は最高のまま維持されてしまう結果となる。
ここでは、GCを用いるコンピュータ・システムにおいて、メモリの電力消費を低減するため、単位時間あたりのGCによる実質的なプログラム性能の低下(GCオーバーヘッド、すなわちGCの所要時間による他のプログラム処理の所要時間の増加)が所定の目標通りになる場合に、サブヒープ領域(ランク)14−1〜14−Lの数を減らして消費電力を低減する。そして、サブヒープ領域14−1〜14−L数を減らした際のGCオーバーヘッドの変化を、予めモデル化しておく。
いま、単位時間あたりにおいてGCがN回発生し、各GCのCPU時間(CPU処理時間)がt時間である場合、上記のGCオーバーヘッドはN×tで与えられる。N×tがGCオーバーヘッドの設定目標値T(例えば、外部からQoSとして与えられる)に近くなるように、ヒープ領域の消費速度に適応して制御する。
このGCオーバーヘッドが目標値T以下(N×t<T)では、サブヒープ領域14−1〜14−Lに余裕があるとして、総サブヒープ数をR、サブヒープ数の変化量をn(nは負)とする。そして、そのときのGC頻度(すなわちガベージコレクションの発生頻度)の増加割合をF(n)とする。また、GC頻度が増加することが起因となって増加するGC一回あたりのCPU時間割合をP(n)とする。
式[I]がT以下となるようなnが見つかれば、サブヒープ数をnだけ変化させる。GCオーバーヘッドが目標値Tを上回ってサブヒープ数を増やす場合は、上記の操作と逆の操作を行う。すなわち、サブヒープ数は、目標値Tと、式[I]のN×tで表されるGCの所要時間及び/またはF(n)で表されるガベージコレクションの発生頻度との大小関係に基づいて変更され得る。
ここで、本発明の実施の形態によるメモリ電力制御方法が用いられるコンピュータ・システムにおけるGCについて説明する。一般に、GCを用いたオブジェクト指向言語であるJava(登録商標)処理系における効率の良いGCとして、所謂世代別GCが用いられている。
世代別GCでは、ヒープ領域をヤング(Young)及びオールド(Old)という世代別に分割しており、オブジェクト(Object)はヤングヒープから順次割り当てられる。この際、マルチプロセッサシステムにおいて、効率良く動作するように、オブジェクトの割り当て毎にヤングヒープから割り当てる代わりに、各スレッドは、複数のオブジェクトが割り当てられるサイズを有する領域(割当バッファ)を自分専用としてヤングヒープから割り当て、オブジェクトは割当バッファから割り当てる。
世代別GCにおいては、ヤングヒープが使い尽くされると、ヤングヒープだけをGCする(マイナーガベージコレクション、(マイナーGC、またはminor GC))。マイナーGCを数回に亘って生き残ったオブジェクトはオールドヒープに移動し、マイナーGCの対象とせず、マイナーGCに要するCPU時間を下げる。オールドヒープを使い果たした際には、ヒープ領域全体をGCする(フルガベージコレクション(フルGC、またはFull GC))。
ここで、前述の関数F(n)は次のように定義される。ヒープの消費速度は、ヒープサイズに影響されないので、ヒープ消費速度が同一であるとすると、ヒープサイズが小さくなれば、その分だけ早くGCが発生する。従って、GC頻度の増加割合は次式のように単純化することができる。
図6は、ヤングヒープに対するサブヒープ数の制御を説明するためのフロー図である。図1に示すように、VM12は、GCオーバーヘッドを表すGCオーバーヘッド情報をエネルギーコントローラ15に与えており、エネルギーコントローラ15は、後述するように、VM12にヒープサイズ制御信号を与える。
図6において、まず、エネルギーコントローラ15は、割当バッファが空であるか否かを調べる(S601)。
割当バッファが空であると、ヤングヒープからサイズS1の割当バッファを割り当てる(S602)。そして、割当カウンタにS1を加算する(S603)。
続いて、モニタタイミングであるか否かを調べて(S604)、モニタタイミングであると、GC周期N=A/Sを求める(S605)。ここで、Sは、現在のヒープサイズを示し、Aは、割当カウンタの現在及び前の値とモニタ間隔とに基づいて求められた割当速度を表す。続いて、現在のモニタ時間と割当カウンタの値を記録する(S606)。
このように、S602〜606の各ステップでは、定期的(例えば、10ms毎)にカウンタの値をモニタして、割当量(前回のモニタ時の値と今回のモニタ時の値の差)を、前回のモニタ時からの経過時間で除算することによって最近の平均オブジェクト消費速度Aが求まる。ヒープサイズをSとすると、GC頻度NはA/Sである。そして、引き続き前述の判定を行うことになる。
いま、Tが0.05(実行時間の5%)、R=8(8ランク)、t=0.2(0.2秒)で実行されているとする。N=0.2(5秒に1回)が観測されとすると、GCオーバーヘッド関係式は、次のように計算できる。
すなわち、この例では、2サブヒープ減らすと判断ができる。
上述のように、Nの観測及びサブヒープ数変更の判定は、ヒープ消費速度の計算(GC頻度の予測)のタイミングで行われる。ヒープ消費速度の変化は、割当カウンタを利用してプログラム実行中に自動的に計算される。なお、割当カウンタとは、ヤングヒープから割当バッファを割り当てる度に、割当バッファのサイズを積算するカウンタである。
その後、エネルギーコントローラ15は、VM12によってサブヒープの増減に対応して、ヤングヒープにnのサブヒープを追加するかまたはヤングヒープからnのサブヒープを除く処理を行う(S608)。
つまり、サブヒープ変更数カウンタを備えて、このサブヒープ変更数カウンタによって、目標のサブヒープ数を表す。例えば、現在のサブヒープ数が「8」で「2」減らすと判断をしたとき、カウンタに「6」を書き込む。ヒープ消費速度の計算(GC頻度の予測)のタイミングで、サブヒープ変更の判定をした後、引き続き、現在のサブヒープ数とカウンタの値が異なれば、サブヒープ数がカウンタ値になるように、サブヒープ数を増減することになる。または、ミューテータ(mutator)のオーバーヘッドを減らすために、変更を次のマイナーGCまで遅延するようにしてもよい。
具体的には、マイナーGCは、GCが終わった後カウンタを読み込み、現在のサブヒープ数とカウンタの値が異なれば、サブヒープ数をカウンタ値になるように、サブヒープ数を増減する。サブヒープ変更数カウンタは、スレッドが割当バッファを取得する度にサブヒープ変更数カウンタを参照して、前述のように、ヤングヒープからの割当バッファの取得はスレッド間で同期して行われる。
図7は、オールドヒープに対するサブヒープ数制御を説明するためのフロー図である。オールドヒープに対する制御は、ヤングヒープの場合とはやや異なり、最初のフルGCが発生するまでオールドヒープは連続的に消費される。従って、必要に応じてサブヒープをオールドヒープに追加する。フルGCが発生した後、生きているオブジェクトを、ある場所に集めるコンパクションを行わなければ、生きているオブジェクトはオールドヒープ中の複数のサブヒープに分散している。
一般的に、コンパクションには時間がかかるため、VM12の構成の場合、可能な限り行わないようにすることが望ましい。ここでは、実際に、アクセスするオブジェクトを選択的にコンパクションして、可能な限り少ない数のサブヒープ内にそれらのオブジェクトが置かれるようにする。
図7において、メモリアクセスイベントが発生したか否かを検知して(S701)、メモリアクセスイベントが発生すると、サンプリング・プロファイルが必要であるか否かを判定する(S702)。サンプリング・プロファイルが必要であると判定されると、オブジェクト・フィールドへのアクセスをサンプリング・プロファイルする。
例えば、フィールドアクセスを記録する計装コード(instrumented code)を定期的に有効にしてフィールドアクセスを記録する方法、または、メモリアクセス用のCPUパフォーマンス・カウンタを用いて定期的にメモリアクセスを記録する方法等がある。つまり、メモリアドレスを取得し(S703)、そのメモリアドレスはオールドヒープ内であるか否かを判定して(S704)、そうであれば、アクティブクラスにオブジェクトのクラスを記録する(S705)。
ところで、フルGCの際に、生き残るオブジェクトのうちアクティブクラスのオブジェクトを事前に与えた特定のサブヒープ(アクティブ・サブヒープ)に移動する。図8は、フルGCにおけるアクティブクラスのオブジェクトのアクティブ・サブヒープへの移動を説明するためのフロー図であり、まず、オールドヒープにオブジェクトに対する空スペースが存在するか否かを判定する(S801)。空スペースが存在すると、未処理生存オブジェクトがあるか否かを判定する(S802)。未処理生存オブジェクトがあると、当該生存オブジェクトのクラスがアクティブクラスであるか否かを判定する(S803)。そして、生存オブジェクトのクラスがアクティブクラスであると、当該オブジェクトをアクティブ・サブヒープに移動する(S804)。
上述の説明から明らかなように、ここでは、オールドヒープがいっぱいになると、フルGCを行い、生存(生き残る)オブジェクトの各々についてアクティブクラスのオブジェクトであれば、アクティブ・サブヒープに移動することになる。そして、移動する量が多ければ、複数のフルGCに分けて実行する。
また、このコンパクションに関する情報をマイナーGCで用いることができる。図9は、ヤングヒープからオールドヒープのアクティブ・サブヒープへオブジェクトを移動する際の処理を説明するフロー図であり、まず、ヤングヒープにバッファに対する空スペースがあるか否かを判定する(S901)。
空スペースがなければ、GCがオールドヒープに移動するオブジェクトが存在するか否かを判定する(S902)。そのようなオブジェクトが存在すると、オブジェクトのクラスがマークされているか否かを判定し(S903)、マークされていれば、当該オブジェクトをアクティブ・サブヒープに移動する(S904)。一方、マークされていなければ、当該オブジェクトを非アクティブ・サブヒープに移動する(S905)。
このように、マイナーGCがオブジェクトをオールドヒープに移動するに当たって、コンパクション対象のオブジェクト・クラスであれば、アクティブ・サブヒープに移動することになる。
また、一定時間(所定の時間)、サンプリング・プロファイルに入らなかったコンパクション対象のオブジェクト・クラスは、プログラム挙動の変化でアクセスしなくなったとみなして、コンパクション対象から削除する。そして、コンパクションの際にアクティブ・サブヒープから他のサブヒープに移動する。
アクセスされるオブジェクトがないサブヒープ(ヤングヒープから削除したサブヒープやオールドヒープの非アクティブなサブヒープ)に対して、それらサブヒープに割り当てられているメモリが属するランクを省電力モードにする。これらは、能動的に行うか受動的に行われる。例えば、前者の場合、サブヒープを削除する際(図6のS608)、削除されるサブヒープにOS11により対応させたランク(図2のS203)に対して、OS11経由で省電力モードにすることを指示する。
一方、追加の場合には、追加されるサブヒープのランクに対して通常モードにすることを指示する。メモリコントローラは外部から省電力モード切り替えコマンドを受け付ける機能を有し、OS11は、例えば、I/Oポートを介してコマンドを発行する機能を有する。
この方式は、後者に比べて、OSやハードウェアに機能を必要とする一方、メモリへのアクセスがないので判断がすばやくでき、省電力期間をより長くできる。また、メモリへのアクセスが近い将来起きるという判断が早めにできる結果、先行して通常モードにでき、その結果、プログラム実行速度への影響を減らすことができる。
一方、後者においては、メモリコントローラがメモリアクセスの履歴を観察して、例えば、一定時間アクセスがない場合に、省電力モードに切り替え、その後の最初のアクセス時に通常モードに切り替えることになる。
メモリコントローラに実装が容易となるように、例えば、100,000サイクルの間、メモリ参照がなければ省電力モードに切り替え、最初のアクセスで通常モードに切り替えるようにする。実装には、ランク毎にカウンタを準備し、カウンタをサイクル毎に減少して、ゼロになったら省電力モードに切り替えるようにする。カウンタの初期値は参照がない期間の間、閾値を示し、アクセス毎にセットされることになる。
図10は、本発明の実施の形態による、電力制御プログラムを実行する装置のハードウェア構成を示す図である。図10においては、電力制御プログラムを実行する装置を情報処理装置1000とし、そのハードウェア構成を例示する。以下は、コンピュータを典型とする情報処理装置として全般的な構成を説明するが、その環境に応じて必要最小限な構成を選択できることはいうまでもない。
情報処理装置1000は、CPU(Central Processing Unit)1010、バスライン1005、通信I/F1040、メインメモリ1050、BIOS(Basic Input Output System)1060、パラレルポート1080、USBポート1090、グラフィック・コントローラ1020、VRAM1024、音声プロセッサ1030、I/Oコントローラ1070、ならびにキーボード及びマウス・アダプタ1100等の入力手段を備える。I/Oコントローラ1070には、フレキシブル・ディスク(FD)ドライブ1072、ハードディスク1074、光ディスク・ドライブ1076、半導体メモリ1078等の記憶手段を接続することができる。
音声プロセッサ1030には、マイクロホン1036、増幅回路1032、及びスピーカ1034が接続される。また、グラフィック・コントローラ1020には、表示装置1022が接続されている。
BIOS1060は、情報処理装置1000の起動時にCPU1010が実行するブートプログラムや、情報処理装置1000のハードウェアに依存するプログラム等を格納する。FD(フレキシブル・ディスク)ドライブ1072は、フレキシブル・ディスク1071からプログラムまたはデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050またはハードディスク1074に提供する。図10には、情報処理装置1000の内部にハードディスク1074が含まれる例を示したが、バスライン1005またはI/Oコントローラ1070に外部機器接続用インタフェース(図示せず)を接続し、情報処理装置1000の外部にハードディスクを接続または増設してもよい。
光ディスク・ドライブ1076としては、例えば、DVD−ROMドライブ、CD−ROMドライブ、DVD−RAMドライブ、BD(Blu−ray Disk)−ROMドライブ等を使用することができる。この際は各ドライブに対応した光ディスク1077を使用する必要がある。光ディスク・ドライブ1076は光ディスク1077からプログラムまたはデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050またはハードディスク1074に提供することもできる。
情報処理装置1000に提供されるコンピュータ・プログラムは、フレキシブル・ディスク1071、光ディスク1077、またはメモリカード等の記録媒体に格納されて利用者によって提供される。このコンピュータ・プログラムは、I/Oコントローラ1070を介して、記録媒体から読み出され、または通信I/F1040を介してダウンロードされることによって、情報処理装置1000にインストールされ実行される。コンピュータ・プログラムが情報処理装置に働きかけて行わせる動作は、既に説明した装置における動作と同一であるので省略する。
前述のコンピュータ・プログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としてはフレキシブル・ディスク1071、光ディスク1077、またはメモリカードの他に、MD等の光磁気記録媒体、テープ媒体を用いることができる。また、専用通信回線やインターネットに接続されたサーバシステムに設けたハードディスクまたは光ディスク・ライブラリ等の記憶装置を記録媒体として使用し、通信回線を介してコンピュータ・プログラムを情報処理装置1000に提供してもよい。
以上の例は、情報処理装置1000について主に説明したが、コンピュータに、情報処理装置で説明した機能を有するプログラムをインストールして、そのコンピュータを情報処理装置として動作させることにより上記で説明した情報処理装置と同様な機能を実現することができる。
本装置は、ハードウェア、ソフトウェア、またはハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアの組み合わせによる実施では、所定のプログラムを有するコンピュータ・システムでの実施が典型的な例として挙げられる。係る場合、該所定のプログラムが該コンピュータ・システムにロードされ実行されることにより、該プログラムは、コンピュータ・システムに本発明に係る処理を実行させる。このプログラムは、任意の言語、コード、または表記によって表現可能な命令群から構成される。そのような命令群は、システムが特定の機能を直接実行すること、または(1)他の言語、コード、もしくは表記への変換、(2)他の媒体への複製、のいずれか一方もしくは双方が行われた後に、実行することを可能にするものである。もちろん、本発明は、そのようなプログラム自体のみならず、プログラムを記録した媒体を含むプログラム製品もその範囲に含むものである。本発明の機能を実行するためのプログラムは、フレキシブル・ディスク、MO、CD−ROM、DVD、ハードディスク装置、ROM、RAM、M−RAM(Magnetoresistive RAM)、フラッシュメモリ等の任意のコンピュータ可読媒体に格納することができる。係るプログラムは、コンピュータ可読媒体への格納のために、通信回線で接続する他のコンピュータ・システムからダウンロードしたり、他の媒体から複製したりすることができる。また、係るプログラムは、圧縮し、または複数に分割して、単一または複数の記録媒体に格納することもできる。
本発明は、タイマーを用いてアイドリング状態が一定期間継続した装置の構成要素を適宜スタンバイ動作に遷移させる技術等の、既存の技術と組み合わせることができ、そのように組み合わせた技術もまた、本発明の技術範囲に含まれる。同様に、本発明の技法を含む省電力モードを実行するシステム等も、本発明の技術範囲に含まれる。更に、本発明の技法は、消費電力を制御するための諸段階を、FPGA(現場でプログラム可能なゲートアレイ)、ASIC(特定用途向け集積回路)、これらと同等のハードウェアロジック素子、プログラム可能な集積回路、またはこれらの組み合わせが記憶し得るプログラムの形態、すなわちプログラム製品として提供し得る。具体的には、データ入出力、データバス、メモリバス、システムバス等を備えるカスタムLSI(大規模集積回路)の形態として、本発明に係る省電力モードを実行するための手段を提供でき、そのように集積回路に記憶されたプログラム製品の形態も、本発明の技術範囲に含まれる。
以上、本発明の実施形態について説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施例に記載されたものに限定されるものではない。
11 オペレーティング・システム(OS)
12 仮想マシン(Java Vertual Machine:VM)
13 物理メモリ
14 ヒープメモリ(ヒープ領域)
15 エネルギーコントローラ
12 仮想マシン(Java Vertual Machine:VM)
13 物理メモリ
14 ヒープメモリ(ヒープ領域)
15 エネルギーコントローラ
Claims (10)
- 省電力モードを備えるメモリを備え、不要となったオブジェクトをまとめて回収するガベージコレクションが動作するコンピュータで用いられ、前記メモリのアドレス空間を所定の固定サイズで分割したメモリブロックに前記オブジェクトが割り当てられ、前記メモリの電力制御を行うためのメモリ電力制御方法であって、
前記コンピュータが、
前記メモリ上のヒープ領域を複数のサブヒープ領域に分割して管理する第1のステップと、
前記ガベージコレクションの所用時間と予め規定された目標値との大小関係に基づいて前記サブヒープ領域の数を動的に変更する第2のステップと、を実行する、
メモリ電力制御方法。 - 前記第1のステップは、前記メモリブロックのうちで前記電力制御のタイミングが同一であるメモリブロック毎にサブヒープ領域を生成して管理する、請求項1に記載のメモリ電力制御方法。
- 前記第2のステップは、更に前記ガベージコレクションの発生頻度に基づく、請求項1に記載のメモリ電力制御方法。
- 更に、前記コンピュータは、予め規定された期間を越えて生存してアクセスされるオブジェクトを生存オブジェクトとし、当該生存オブジェクト及びそのクラスをオブジェクト・アクセスの状況を示すアクセスプロファイルで識別する第3のステップと、
前記ガベージコレクションを実行する際に、前記生存オブジェクトを予め定められたサブヒープ領域に集める第4のステップと、を実行する、
請求項1に記載のメモリ電力制御方法。 - 前記ガベージコレクションが世代別ガベージコレクションであり、前記ヒープ領域がヤングヒープ領域及びオールドヒープ領域に分割され、前記オブジェクトが前記ヤングヒープ領域から割り当てられており、
前記ガベージコレクションは前記ヤングヒープ領域に使い尽くされた場合には、前記ヤングヒープ領域のみの前記ガベージコレクションを行うマイナーガベージコレクションを実行する、請求項4に記載のメモリ電力制御方法。 - 前記コンピュータは、予め定められた回数以上前記マイナーガベージコレクションを行った際にも生存するオブジェクトを前記オールドヒープ領域に移動する第5のステップを実行する、請求項5に記載のメモリ電力制御方法。
- 前記ガベージコレクションは前記オールドヒープ領域を使い果たした場合に前記ヒープ領域の全てについてガベージコレクションを行うフルガベージコレクションを実行する、請求項6に記載のメモリ電力制御方法。
- 前記コンピュータは、前記フルガベージコレクションが行われるに当たって、前記オールドヒープ領域にある生存オブジェクトを前記オールドヒープ領域の所定のサブヒープ領域に集める第6のステップを実行する、請求項7に記載のメモリ電力制御方法。
- 省電力モードを備えるメモリを備え、不要となったオブジェクトをまとめて回収するガベージコレクションが動作するコンピュータで用いられ、前記メモリのアドレス空間を所定の固定サイズで分割したメモリブロックに前記オブジェクトが割り当てられ、前記メモリの電力制御を行うためのメモリ電力制御方法であって、
前記コンピュータが、
前記メモリ上のヒープ領域を複数のサブヒープ領域に分割して管理する第1のステップと、
前記ガベージコレクションの所用時間と予め規定された目標値との大小関係に基づいて前記サブヒープ領域の数を動的に変更する第2のステップと、
予め規定された期間を越えて生存してアクセスされるオブジェクトを生存オブジェクトとし、当該生存オブジェクト及びそのクラスをオブジェクト・アクセスの状況を示すアクセスプロファイルで識別する第3のステップと、
前記ガベージコレクションを実行する際に、前記生存オブジェクトを予め定められたサブヒープ領域に集める第4のステップと、
前記ガベージコレクションは世代別ガベージコレクションであり、前記ガベージコレクションはマイナーガベージコレクション及びフルガベージコレクションを含み、前記ヒープ領域はヤングヒープ領域及びオールドヒープ領域に分割され、前記オブジェクトは前記ヤングヒープ領域から割り当てられており、前記ガベージコレクションは前記ヤングヒープ領域によって使い尽くされた場合には、前記ヤングヒープ領域のみの前記ガベージコレクションを行う前記マイナーガベージコレクションを実施し、前記ガベージコレクションは前記オールドヒープ領域を使い果たした場合に前記ヒープ領域の全てについて前記フルガベージコレクションを実施し、予め定められた回数以上前記マイナーガベージコレクションを行った際にも生存するオブジェクトを前記オールドヒープ領域に移動する第5のステップと、
前記フルガベージコレクションが行われるに当たって、前記オールドヒープ領域にある生存オブジェクトを前記オールドヒープ領域の所定のサブヒープ領域に集める第6のステップと、を実行する、
メモリ電力制御方法。 - 請求項1から9のいずれか1項に記載の方法の各ステップをコンピュータに実行させる、コンピュータ・プログラム。
Priority Applications (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2008298335A JP4711269B2 (ja) | 2008-11-21 | 2008-11-21 | メモリ電力制御方法及びメモリ電力制御プログラム |
| US12/622,470 US8140600B2 (en) | 2008-11-21 | 2009-11-20 | Memory power control method and memory power control program |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2008298335A JP4711269B2 (ja) | 2008-11-21 | 2008-11-21 | メモリ電力制御方法及びメモリ電力制御プログラム |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JP2010123059A JP2010123059A (ja) | 2010-06-03 |
| JP4711269B2 true JP4711269B2 (ja) | 2011-06-29 |
Family
ID=42223751
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2008298335A Expired - Fee Related JP4711269B2 (ja) | 2008-11-21 | 2008-11-21 | メモリ電力制御方法及びメモリ電力制御プログラム |
Country Status (2)
| Country | Link |
|---|---|
| US (1) | US8140600B2 (ja) |
| JP (1) | JP4711269B2 (ja) |
Families Citing this family (11)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR101136984B1 (ko) * | 2010-03-29 | 2012-04-19 | 에스케이하이닉스 주식회사 | 전압 공급 제어회로 및 이를 이용한 반도체 장치 |
| US20130132740A1 (en) * | 2011-11-23 | 2013-05-23 | O2Micro, Inc. | Power Control for Memory Devices |
| US8694562B2 (en) * | 2012-05-22 | 2014-04-08 | Microsoft Corporation | Generational garbage collection for a pool-based heap |
| KR101992940B1 (ko) | 2012-08-08 | 2019-06-26 | 삼성전자주식회사 | 메모리 컨트롤러의 동작 방법, 및 상기 메모리 컨트롤러를 포함하는 시스템 |
| WO2015011954A1 (ja) * | 2013-07-23 | 2015-01-29 | 株式会社島津製作所 | ガスクロマトグラフ |
| WO2015116173A2 (en) * | 2014-01-31 | 2015-08-06 | Hewlett-Packard Development Company, L.P. | Unifying memory controller |
| US11030262B2 (en) * | 2015-08-25 | 2021-06-08 | Verizon Media Inc. | Recyclable private memory heaps for dynamic search indexes |
| US20180121348A1 (en) * | 2016-10-31 | 2018-05-03 | Microsoft Technology Licensing, Llc | Automatic Garbage Collection for Distributed Storage |
| US10915424B2 (en) | 2017-10-12 | 2021-02-09 | The Board Of Regents Of The University Of Texas System | Defeating deadlocks in production software |
| US10901828B2 (en) * | 2017-10-26 | 2021-01-26 | Board Of Regents, The University Of Texas System | Freeguard: a faster secure heap allocator |
| EP3945424B1 (en) * | 2020-07-31 | 2024-01-17 | NXP USA, Inc. | Memory power management method and processor system |
Family Cites Families (11)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US4851987A (en) * | 1986-01-17 | 1989-07-25 | International Business Machines Corporation | System for reducing processor power consumption by stopping processor clock supply if a desired event does not occur |
| NL9001262A (nl) * | 1990-06-05 | 1992-01-02 | Oce Nederland Bv | Werkwijze voor het in een logisch georganiseerd systeem, van door digrafen te representeren groepen van met elkaar in relatie staande entiteiten, distribueren van status-informatie betreffende een digraaf en een inrichting voor het toepassen van een dergelijke werkwijze. |
| US5784628A (en) * | 1996-03-12 | 1998-07-21 | Microsoft Corporation | Method and system for controlling power consumption in a computer system |
| JP2000172386A (ja) * | 1998-12-04 | 2000-06-23 | Toshiba Corp | コンピュータシステムおよびメモリ電源管理方法 |
| JP2002297443A (ja) * | 2001-04-02 | 2002-10-11 | Sharp Corp | 動的メモリ管理装置と動的メモリ管理方法とコンピュータプログラムとこれを記録した記録媒体およびこれらを備えた携帯端末 |
| US7251671B2 (en) * | 2004-03-26 | 2007-07-31 | Intel Corporation | Method and system for garbage collection wherein resetting the mark/allocation bit, and switching the mark/allocation bit to the mark bit to perform marking and scanning of objects using the identified object as a root object and providing mark/allocation bit information being displayed at the client |
| US7769974B2 (en) * | 2004-09-10 | 2010-08-03 | Microsoft Corporation | Increasing data locality of recently accessed resources |
| JP4209906B2 (ja) | 2006-08-02 | 2009-01-14 | 株式会社日立製作所 | 低消費電力メモリ管理方法及びその方法を用いた計算機 |
| US8601469B2 (en) * | 2007-03-30 | 2013-12-03 | Sap Ag | Method and system for customizing allocation statistics |
| US7904493B2 (en) * | 2007-03-30 | 2011-03-08 | Sap Ag | Method and system for object age detection in garbage collection heaps |
| JP4902501B2 (ja) * | 2007-11-12 | 2012-03-21 | 株式会社日立製作所 | 電力制御方法、計算機システム、及びプログラム |
-
2008
- 2008-11-21 JP JP2008298335A patent/JP4711269B2/ja not_active Expired - Fee Related
-
2009
- 2009-11-20 US US12/622,470 patent/US8140600B2/en not_active Expired - Fee Related
Also Published As
| Publication number | Publication date |
|---|---|
| US8140600B2 (en) | 2012-03-20 |
| US20100138460A1 (en) | 2010-06-03 |
| JP2010123059A (ja) | 2010-06-03 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JP4711269B2 (ja) | メモリ電力制御方法及びメモリ電力制御プログラム | |
| US10970203B2 (en) | Methods and apparatus for compressed and compacted virtual memory | |
| US9015203B2 (en) | Balloon object feedback for Java Virtual Machines | |
| CN104090848B (zh) | 一种周期性大数据处理的内存管理方法及装置 | |
| KR20120058352A (ko) | 하이브리드 메모리 시스템, 및 그 관리 방법 | |
| CN110291508B (zh) | 垃圾收集器 | |
| EP3239844A1 (en) | Processing method and device for memory page in memory | |
| JP2007272573A (ja) | 低消費電力化メモリ管理方法及びメモリ管理プログラム | |
| US8904145B2 (en) | Adjusting memory allocation of a partition using compressed memory paging statistics | |
| EP2936317A1 (en) | In-place change between transient and persistent state for data structures in non-volatile memory | |
| CN104731515A (zh) | 控制存储设备机群磨损均衡的方法及设备 | |
| JP2011186561A (ja) | メモリ管理装置 | |
| JP2019028572A (ja) | 情報処理装置、情報処理システム、情報処理方法及び情報処理プログラム | |
| CN112654965A (zh) | 动态模块的外部分页和交换 | |
| US9870400B2 (en) | Managed runtime cache analysis | |
| CN104281532B (zh) | 一种基于numa架构的虚拟机内存访问监测方法 | |
| CN107077420B (zh) | 覆盖擦除块映射 | |
| TWI539368B (zh) | 資料寫入方法與系統 | |
| JP5577518B2 (ja) | メモリ管理方法、計算機及びメモリ管理プログラム | |
| JPWO2014147840A1 (ja) | アクセス制御プログラム、ディスク装置及びアクセス制御方法 | |
| CN109684235A (zh) | 一种计算机系统应用高速缓存的方法、装置及设备 | |
| Shen et al. | Zone Based Writing Optimization in User Space | |
| Abir | Understanding performance impact of unaligned writes in solid state disks | |
| KR20250117996A (ko) | 스토리지 시스템 및 그의 동작 방법 | |
| CN120872526A (zh) | 移动设备和控制移动设备方法 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20101028 |
|
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20110222 |
|
| RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20110224 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20110315 |
|
| LAPS | Cancellation because of no payment of annual fees |