Java 什么是「;“实际后果”;如何使用软引用?

Java 什么是「;“实际后果”;如何使用软引用?,java,caching,garbage-collection,soft-references,Java,Caching,Garbage Collection,Soft References,根据番石榴的文件: 警告:在大多数情况下,最好设置每个缓存的最大大小,而不是使用软引用。只有当您非常熟悉软引用的实际后果时,才应该使用此方法 我对软引用有一定的了解——它们的行为、用途以及它们与垃圾收集的契约。然而,我想知道博士提到的这些实际后果是什么。为什么使用最大大小比使用软引用更好?在实现缓存方面,软引用的算法和行为不比硬编码的上限更有效吗?我认为它们也暗示了,如果您使用软引用映射,您应该为最大内存使用量和潜在的更多gc活动做好准备,因为引用只是gc的,所以需要释放内存 如果您知道只需要缓

根据番石榴的文件:

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


我对软引用有一定的了解——它们的行为、用途以及它们与垃圾收集的契约。然而,我想知道博士提到的这些实际后果是什么。为什么使用最大大小比使用软引用更好?在实现缓存方面,软引用的算法和行为不比硬编码的上限更有效吗?

我认为它们也暗示了,如果您使用软引用映射,您应该为最大内存使用量和潜在的更多gc活动做好准备,因为引用只是gc的,所以需要释放内存

如果您知道只需要缓存中的最后n个值,那么使用LRU缓存是一种更精简的方法,对于正在运行的应用程序来说,资源使用情况更可预测

此外,据研究,服务器和客户端JVM之间的行为似乎存在细微的差异

Sun JRE确实处理软引用 与weakreference不同。我们 试图抓住对象 如果存在,则由SoftReference引用 难道压力不存在吗 记忆。其中一个细节是:针对 “-client”和“-server”JRE是 不同:客户端JRE尝试 让你的脚印保持小的距离 倾向于清除软引用 而不是扩展堆 服务器JRE试图保持您的 性能高,倾向于 扩展堆(如果可能)而不是 而不是清晰的软引用。一号 不适合所有人


使用软引用的一个实际问题是,它们往往一次就被丢弃。拥有缓存的原因是在大多数情况下提供相当好的性能

但是,对缓存使用SoftReferences可能意味着在应用程序停止GC后,它将缓慢运行,直到重建缓存。i、 就在你需要赶上的时候


注意:您可以使用a,它不必很复杂。

+1我不知道它们通常一下子就被丢弃了。感谢您的帮助。如果可以在GC上丢弃WeakReference,则由GCs自行决定是否丢弃SoftReference。然而,如果一个人不得不离开,他们很可能都会被收回。i、 这不是一个优雅的下降。谢谢,我现在可以更清楚地看到LRU的优点了。通过这条路线,有没有办法保证没有强可达对象被逐出(使用MapMaker)?