1

我有一个包含十万个条目的新旧地图:

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'd 浮动(如果 object1 和 object2 都指向oldMap,并且你将 object1 更新为指向newMap,那么object2 仍将指向oldMap哪个会阻止它被 GC 处理)

于 2013-07-12T14:03:02.023 回答