我有一个包含十万个条目的新旧地图:
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