【发布时间】:2016-02-07 01:32:02
【问题描述】:
我有一个每 5 分钟调用一次的 @Scheduled 方法。
批处理进行大量计算,大约需要 2-15 分钟才能完成(如果批处理已经在运行,有一个标志会阻止批处理运行)。
我使用大量Maps 来缓存计算结果。我可以这样恢复。一个主要的 Map 将包含累积结果,以及一些 Map/List into submethod for internal calculus。
批处理可能需要大约 3-6 Gigs 才能运行。要分析大量数据。
我认为当代码退出方法时,我在方法中使用的 Map/List 将有资格进行 GC,对吧?
我应该在我的方法中使用WeakHashMap 或WeakReference 还是在退出方法之前调用Map.clear();?
如果可能,我想减少内存使用量,不要在批处理结束时等待 GC 进行清理。
批处理完成后,内存将减少到 500megs-1G max。
【问题讨论】:
-
我想你不想在你的方法还在运行的时候丢失缓存的值,所以弱引用/映射并不是很有用。此外,它会导致相反的结果,在方法运行时收集部分数据会提高 CPU 使用率。最后一次释放所有数据不会产生任何成本,垃圾收集器的资源消耗与剩余对象成正比,而不是与死对象成正比。
标签: java garbage-collection spring-batch weak-references weakhashmap