强制在Java中释放大型缓存对象

Jac*_*ack 10 java garbage-collection

我使用一个大的(数百万)条目hashmap来缓存算法所需的值,关键是两个对象的组合作为long.由于它不断增长(因为地图中的键发生了变化,所以不再需要旧的),能够强行擦除其中包含的所有数据并在执行过程中重新开始会很好,有没有办法有效地执行在Java?

我的意思是释放相关的内存(大约1-1.5gb的hashmap)并从空的hashmap重新启动.

Thi*_*ilo 14

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

至于回收内存,你必须让垃圾收集器完成它的工作.

你的价值观也很长吗?在这种情况下,您可能希望查看比通用HashMap更高(内存)效率的实现,例如GNU Trove库中的TLongLongHashMap .这应该可以节省大量内存.


pol*_*nts 13

听起来你需要一个WeakHashMap:

Map具有弱键的基于散列表的实现.WeakHashMap当其密钥不再正常使用时,将自动删除该条目中的条目.更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收.当一个键被丢弃时,它的条目将被有效地从映射中删除,因此该类的行为与其他Map实现的行为略有不同.

不过,我不确定它如何与Long键配合使用.此外,这可能是有趣的:

WeakHashMap不是缓存!了解WeakReference和SoftReference

  • 我不太确定这是否适用于Long键.毕竟,相同的Long实例可能在完全不相关的代码中使用,更重要的是,密钥Long也可以存储为单独的实例或原语,以便引用不会保持活动(即使仍处于活动状态) . (5认同)