为什么散列图clear()释放的内存多于指针重新分配

时间:2013-07-12 14:00:15

标签: java memory-management garbage-collection clear

我有一张旧的和新的地图,其中包含数十万个条目:

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,我使用第一种方法更快地耗尽内存,这对我来说也不清楚。

1 个答案:

答案 0 :(得分:2)

你是正确的,它在内存方面不应该有任何区别 - 你必须有另一个引用oldMap浮动,以防止它被GC(如果object1和object2都指向{{ 1}},并且您更新object1以指向oldMap,然后object2仍将指向newMap,这将阻止它被GC'd)