プロパティファイルが肥大化してきたので、ResourceBundle 使用時のメモリ効率が気になってきた。ムズムズと。
ResourceBundle クラスで読み込んだプロパティファイルのデータは、メモリ上に保持される。そのため、一度ファイルからデータを読んでしまえば、次回からのプロパティデータへのアクセスでは、IO に関するオーバーヘッドが無くなる。素敵だ。
しかし、ここで気になるのは、もしプロパティファイルに大量のデータがあった場合、メモリが食い潰されてしまうのではないかということ。
国際化対応に使われるくらいだから、ある程度のデータ量にも十分耐えうる仕組みを採用しているだろうと予想しつつも、そこで貴重なメモリ領域が、それなりに使われているのは確か。
で、ソースを追っていったら、読み込む bundle をソフト参照(SoftReference)で保持していた。つまり、メモリのことは JavaVM に任せておけば良いみたい。とは言え、bundle 単位で参照を持つので、あまり巨大なプロパティファイルを読み込むのは、結局メモリを圧迫してよろしくなさそう。ある程度は細分化して管理した方が、キャッシュ機能を有効に使えるかもしれない。
ResourceBundle クラスの Javadoc には、こうしたメモリ管理の話が出てこない。いや、Java の標準 API の Javadoc 全体を眺めていても、メモリに関する話って、ほとんど出てこない。
メモリのことは全て GC に任せ、あまりメモリのことは意識せずに、プログラムを組んでいきましょう。Java 言語としては、そういうスタンスなのかもしれない。でも、中規模以上のシステム構築になると、メモリ効率は気になるところ。かゆい、かゆい。
とりあえず。
基本APIを使っている分には、GCの動作を考慮した最適な実装がされていそうなので、あまり気にしなくても良いのかな。自分で、オブジェクトプールを作ったり、ビットマップキャッシュするときに、WeakReference とかを考えられれば、まずは良いのかもしれない。
そういや、Flash のメモリ周辺とかって、一体どうなっているんだろう。GCの動きとか知らないなあ…。