java - 为什么 hashmap Clear() 比指针重新分配释放更多的内存

标签 java memory-management garbage-collection

我有一张新旧 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/

相关文章:

c++ - 非托管 C++ 垃圾收集帮助

c# - 如何从多个托管应用程序的大对象堆 LOH 中取回未使用的内存?

Java Web 应用程序内存处理

java - 从 JSONObject 深处获取值

java - 使用 Java api 的 Elasticsearch 聚合

c# - 委托(delegate)分配是否在 C# 中创建新副本?

php - APC 何时删除旧条目?

java - 执行请求 关注以编程方式创建的编辑文本

c - 使用大页面分配的内存是否有限制?

objective-c - 引擎盖下的 __weak 限定变量是怎么回事?