咖啡因:如何提出适当的缓存大小

时间:2016-09-15 04:26:03

标签: java caching garbage-collection jvm caffeine

我有一个计算密集的一次性离线处理任务,需要几个小时才能运行,我使用Caffeine作为我的内存缓存。设置最大缓存大小的优秀启发式是什么?我正在使用8GB的RAM运行我的Java程序,我愿意给它大约4GB的缓存,但我不确定内存如何转换为我的缓存的实际大小。我决定和.softValues()一起让JVM决定,但我在咖啡因的JavaDoc中遇到了以下几个字:

  

警告:在大多数情况下,最好设置每缓存最大大小而不是使用软引用。如果您熟悉软引用的实际后果,则应该只使用此方法。

2 个答案:

答案 0 :(得分:7)

软引用在概念上具有吸引力,但通常会损害长时间运行的JVM中的性能。这是因为它们通过填充旧代来创建堆压力,并且在完整GC期间仅为collected。这可能导致GC崩溃,每次释放足够的内存时,它会被快速消耗,并且需要另一个完整的GC。对于对延迟敏感的应用程序,由于驱逐是全局的,因此无法进一步暗示哪些缓存是最关键的。

软引用不应该是默认值,请转到策略。它可能是吞吐量,非面向用户任务的合理简化。但是,当GC时间,延迟和可预测的性能很重要时,它就会很危险。

不幸的是,调整大小的最佳答案是猜测,测量和重复。导出统计信息,尝试设置并进行适当调整。命中率曲线可以通过捕获访问跟踪(关键哈希的日志)和simulating不同大小来获得。它有趣的数据,但通常一些简单的调整运行就足够了。

答案 1 :(得分:2)

软引用允许VM在内存不足时回收对象。这在某种程度上是与缓存不同的策略。您可以只有一个WeakHashMapSoftReferenceWeakReference之间存在差异

一个很大的区别是,缓存通常会让您决定驱逐对象(lru,fifo等)的策略,而Soft / Weak引用则赢了。

您应该能够至少在一定程度上猜测物体的大小。是1k,1mb,10mb?

如果你真的不知道你的对象有多大,那么大多数缓存都允许你为驱逐添加一个监听器并记录它。结合查找缓存未命中的日志应该可以让您对缓存的执行情况有所了解。