1

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 では、最初のアプローチの方がずっと早くメモリ不足になりましたが、これも原因がよくわかりません。

4

1 に答える 1

2

あなたは正しいです、それはメモリの点で何の違いもありません - あなたはoldMapそれがGCされるのを妨げているフローティングへの別の参照を持っている必要があります( object1 と object2 の両方が を指しoldMap、 object1 を を指すように更新したnewMap場合、 object2 はまだ GC されないように指してoldMapいる)

于 2013-07-12T14:03:02.023 に答える