是否在方法中使用WeakHashMap?

时间:2016-02-07 01:32:03

标签: java garbage-collection spring-batch weak-references weakhashmap

我有一个@Scheduled方法,每5分钟调用一次。

批处理做了很多计算,大约需要2-15分钟才能完成(如果一个批处理已经在运行,有一个标志可以阻止批处理运行)。

我使用了很多Map来缓存计算结果。我可以像那样恢复它。一个主要的Map将包含累积结果,一些Map / List为sub方法用于内部微积分。

该批次可能需要3-6 Gigs才能运行..需要分析大量数据。

我认为当代码退出方法时,我在方法中使用的Map / List将有资格使用GC吗?

我应该在我的方法中使用WeakHashMapWeakReference,还是在退出方法之前致电Map.clear();

我想减少内存使用量,如果可能的话,不要在批处理结束时等待GC进行清理。

批次完成后,内存将减少到500megs-1G max。

2 个答案:

答案 0 :(得分:0)

  

我应该在我的方法中使用WeakMap WeakReference吗?

仅当您保留对数据的其他引用并且您不希望阻止该数据被垃圾回收时,弱引用才是好的。它看起来不像你正在做的事情,因为你需要这些数据来继续处理。

  

或在现有方法之前调用Map.clear();

如果地图是您方法的本地地图,则调用clear()不会以任何有意义的方式加速GC。但是,如果您的地图是对象上的一个字段,在您退出方法后仍然可用,那么调用clear是避免“延迟内存泄漏”的重要方法。

就减少内存占用而言,诀窍是确定您不再需要的数据子集,并尽早释放它。如果您一直需要所有数据,或者如果您无法确定接下来需要哪些数据,则无法减少程序的临时占用空间。

答案 1 :(得分:0)

我觉得你想使用WeakHashMap。 WeakHashMap使用弱引用来保存映射键,这允许在应用程序不再使用关键对象时对其进行垃圾收集,并且get()实现可以通过WeakReference.get()告诉死对象的实时映射。返回null。但这只是使Map的内存消耗在应用程序的整个生命周期内不增加所需的一半;在收集关键对象后,还必须执行某些操作以从地图中删除死区条目。否则,Map将简单地填充与死键相对应的条目。虽然这对应用程序是不可见的,但它仍然可能导致应用程序内存不足,因为即使密钥是,也不会收集Map.Entry和value对象。

可以通过定期扫描Map,在每个弱引用上调用get(),并在get()返回null时删除映射来消除死映射。但是如果Map有很多实时条目,这将是低效的。如果有一种方法可以在弱引用的引用被垃圾收集时被通知,那将是很好的,这就是参考队列的用途。

请参阅Weak Hash Reference

上的此页面