当 Caffeine 内存不足时会发生什么?
What happens when Caffeine runs out of memory?
例如,当 Caffeine 在 put
操作期间内存不足时会发生什么?是 OutOfMemoryError
抛出异常,还是操作被忽略?我找不到它在文档中明确说明。
咖啡因不会捕获 OutOfMemoryError
以抑制和逐出条目。当抛出该错误时,JVM 将处于不可预测的状态,该状态可能无法恢复。最好使用 -XX:+ExitOnOutOfMemoryError
和 -XX:+HeapDumpOnOutOfMemoryError
重新启动并离线调查内存泄漏。
起初,将所有可用内存延迟到缓存并让垃圾收集器在需要时逐出似乎是有益的。这就是软引用背后的想法。不幸的是,由于使 full GC 更加频繁并增加了它们的 stop-the-world 暂停时间,这种方法一直很麻烦。相反,我们建议使用明确的最大大小,其中策略非常智能。如果您想要大型缓存,那么通常远程层(如 memcached 或 redis)是一个很好的补充,因此您可以获得本地访问的速度并降低缓存加载的未命中率。
例如,当 Caffeine 在 put
操作期间内存不足时会发生什么?是 OutOfMemoryError
抛出异常,还是操作被忽略?我找不到它在文档中明确说明。
咖啡因不会捕获 OutOfMemoryError
以抑制和逐出条目。当抛出该错误时,JVM 将处于不可预测的状态,该状态可能无法恢复。最好使用 -XX:+ExitOnOutOfMemoryError
和 -XX:+HeapDumpOnOutOfMemoryError
重新启动并离线调查内存泄漏。
起初,将所有可用内存延迟到缓存并让垃圾收集器在需要时逐出似乎是有益的。这就是软引用背后的想法。不幸的是,由于使 full GC 更加频繁并增加了它们的 stop-the-world 暂停时间,这种方法一直很麻烦。相反,我们建议使用明确的最大大小,其中策略非常智能。如果您想要大型缓存,那么通常远程层(如 memcached 或 redis)是一个很好的补充,因此您可以获得本地访问的速度并降低缓存加载的未命中率。