10 万のエントリを含む古いマップと新しいマップがあります。
Map<State, CostAndIndex> oldMap = new LinkedHashMap<State, CostAndIndex>();
Map<State, CostAndIndex> newMap = new LinkedHashMap<State, CostAndIndex>();
ループの各反復の終わりに、私は単純にこれを行っていました:
oldMap = newMap;
そのアプローチでは、 System.gc(); を呼び出しても、しばらくするとメモリが不足していました。再割り当て後。
次に、再割り当ての前にクリアを追加しましたが、メモリが不足することはなくなりました。
oldMap.clear();
oldMap = newMap;
私の質問: なぜ何かが変わるのですか? ポインターの再割り当ては、マップとそのコンテンツが不要になったことを Java に伝え、データをクリアしてスペースを再利用できることを伝えませんか?
注: これは Java HotSpot 1.7 を実行しています。Java HotSpot 1.6 では、最初のアプローチの方がずっと早くメモリ不足になりましたが、これも原因がよくわかりません。