我有一张新旧 map ,其中包含数十万个条目:
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
的引用 float ,以防止它被 GC 处理(如果 object1 和 object2 都指向到 oldMap
,并且更新 object1 以指向 newMap
,那么 object2 仍将指向 oldMap
,这将阻止它被 GC 回收)
关于java - 为什么 hashmap Clear() 比指针重新分配释放更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616687/