我有一张新旧地图,包含十万条条目。
Map<State, CostAndIndex> oldMap = new LinkedHashMap<State, CostAndIndex>();
Map<State, CostAndIndex> newMap = new LinkedHashMap<State, CostAndIndex>();
在每次循环结束时,我都是这样做的。
oldMap = newMap;
用这种方法,过了一会儿我就会用完内存, 即使是在重新分配后调用System.gc();。
后来我在重赋前加了一个clear,就不再用完内存了。
oldMap.clear();
oldMap = newMap;
我的问题是 为什么会有什么变化? 指针重配不是告诉Java不再需要这个地图和它的内容,它可以清除数据并重新使用空间做任何用途吗?
注意:这是在运行Java HotSpot 1.7的情况下。 在Java HotSpot 1.6的情况下,我用第一种方法用完内存的速度更快,我也不清楚为什么。
你是正确的,它不应该在内存方面有任何区别--你必须有另一个引用到 oldMap
漂浮在周围,阻碍了它被GC化(如果object1和object2都指向了 oldMap
,然后你更新object1指向 newMap
那么,object2仍将指向 oldMap
这将防止它被GC'd)