db4oのメモリリーク考察

db4o2006-03-28

db4oにはメモリリークがありますか?

とお伺いすることがあります。答えはNoなのですが、そう見えるオブジェクトがあります。それはFreespaceマネジメントのFreeSlotNodeと、ClassIndexのTreeIntです。FullGCが実行された後も強参照のためメモリ内に残ります。FreeSlotNodeはTreeIntのサブクラスで、TreeIntはTreeのサブクラスです。Treeはバイナリサーチツリーです。

前者はファイルのスロットを管理するためにあり、たくさんのトランザクションを経ると、ファイルのFreeSlotが増えてサイズが大きくなります。この解決はDefragmentかdiscardSmallerThanで一定以下のスロットを再利用しないようにします。

後者はデータベースのインデックスです。これは実行時のオブジェクトグラフです。もしこれらのオブジェクトを開放したい場合には、ClassIndexが保持しているrootノードをpurgeメソッドで開放します。purgeにはpurge()とpurge(object)がありますが、purge()はインデックスを開放し、purge(object)はWeakReferenceからオブジェクトを開放します。現在インデックスの大幅な改良をしており、これらは近いうちに問題にならなくなります。