在 Java 中强制解除分配大型缓存对象

2022-09-04 06:05:39

我使用一个大(数百万)条目哈希图来缓存算法所需的值,键是两个对象的组合作为长。由于它会不断增长(因为映射中的键会发生变化,因此不再需要旧的键),因此能够强制擦除其中包含的所有数据并在执行期间重新开始会很好,有没有办法在Java中有效地做到这一点?

我的意思是释放相关的内存(大约1-1.5gb的哈希映射)并从空的哈希映射重新启动。


答案 1

您可以致电 .这将删除所有数据。请注意,这只会丢弃所有条目,但将用于存储条目的内部数组保持在相同的大小(而不是收缩到初始容量)。如果您还需要消除它,最简单的方法是丢弃整个HashMap并将其替换为新实例。当然,这只有在您控制谁有指向地图的指针时才有效。HashMap.clear()

至于回收内存,您将不得不让垃圾回收器完成其工作。

你的价值观也是多头吗?在这种情况下,您可能希望查看比通用HashMap更有效的实现,例如在GNU Trove库中找到的TLongLongHashMap。这应该可以节省大量内存。


答案 2

听起来你需要一个WeakHashMap来代替:

具有弱键的基于哈希表的实现。当 中的条目的密钥不再正常使用时,将自动删除该条目。更准确地说,给定密钥的映射的存在不会阻止垃圾回收器丢弃该密钥,即最终确定、最终确定,然后回收。当一个键被丢弃时,它的条目实际上会从映射中删除,因此这个类的行为与其他实现略有不同。MapWeakHashMapMap

不过,我不确定这如何用作键。此外,这可能很有趣:Long

WeakHashMap不是缓存!了解弱引用和软引用