我有一张旧的和新的地图,其中包含数十万个条目:
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,我使用第一种方法更快地耗尽内存,这对我来说也不清楚。
答案 0 :(得分:2)
你是正确的,它在内存方面不应该有任何区别 - 你必须有另一个引用oldMap
浮动,以防止它被GC(如果object1和object2都指向{{ 1}},并且您更新object1以指向oldMap
,然后object2仍将指向newMap
,这将阻止它被GC'd)