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からオブジェクトを開放します。現在インデックスの大幅な改良をしており、これらは近いうちに問題にならなくなります。