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

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,使用第一种方法可以更快地用完内存,但我尚不清楚为什么会这样。

最佳答案

您是正确的,它在内存方面没有任何区别-您必须另外引用oldMap浮动,以防止它被GC填充(如果object1和object2都指向oldMap,并且您更新了object1指向newMap,那么object2仍将指向oldMap,这将阻止它被GC

07-24 09:17