当使用在Java中弱和虚引用(When to use Weak and Phantom refere

2019-07-30 08:06发布

我看了很多文章,但我不明白 - 我在哪里需要在实践中使用弱和虚引用? 软引用 - 是缓存一个不错的选择,因为我明白了。 但疲软和幻象,我不知道什么时候使用。 请提供我们需要使用它们的实际任务的例子。

Answer 1:

如你所说,你可以使用弱引用缓存,单纯的喜欢软引用。

有什么好处是PhantomReferences? 我只知道两个严重的情况下他们:第一,它们允许你准确地确定当对象从内存中删除。 他们实际上是确定的唯一途径。 这不是一般的有用,但可能会派上用场,在某些非常特殊的情况下,像操纵大型图片:如果你肯定知道的图像应该被垃圾收集,你可以等到它实际上是试图加载下一个图像之前,因此使可怕的OutOfMemoryError的可能性较小。

其次,PhantomReferences避免与终结的一个根本问题:终结()方法可以创建他们新的强引用“复活”的对象。 还等什么,你说什么? 好了,问题是,它的finalize覆盖()的对象现在必须被确定为是垃圾中的至少两个分开的垃圾收集周期,以被收集。 当第一周期确定它是垃圾,变得适合定稿。 因为(渺茫,但不幸的是真实的)可能性,即对象是“复活”定稿期间,垃圾收集器有实际上可以删除对象之前再次运行。 而由于定稿可能没有及时发生,垃圾回收周期任意数量的可能,而对象在等待最后确定发生了。 这可能意味着在实际清理垃圾对象严重延迟,并且就是为什么你可以得到OutOfMemoryError异常,即使最堆的是垃圾。

有关详细信息,请参阅本页面: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references



Answer 2:

基本上,当你想添加一些额外的数据和对象,它们的源代码是不是你的控制下关联,你会使用弱参考。 通过使用弱裁判你会夫妇的元对象的生命周期主要对象的生命周期。

主要用例幻象裁判是实现自己的终结器线程不使用默认的机制,这是被迫做出的参考,以最终确定代码访问的据称可达对象相关的危险。

软裁判主要用于高速缓存,但是,在另一篇文章说,在这里,他们可以在实践中给予相当灾难性的后果,破坏缓存中极穴。 一个主要的GC(一个将清除软裁判)通常不会发生,直到您应用的性能上升的压力。 这是当你需要你的缓存最多,你最有可能失去它的时间的时间 - 的一次。



Answer 3:

我觉得这个职位回答你的问题非常好。

什么是软引用和Java中的弱引用之间的区别?

基本上是一个软参考比弱引用稍强。 弱引用将在下一个GC周期被丢弃,而软引用将保留在内存中,直到有内存压力和JVM要回收尽可能多的,因为它可以。

你应该想想是你的程序,你必须参考仍然有效是多么重要。 的东西是非常便宜的重建一个参考,我会瘦朝着WeakReference的,但如果它是从DB值则可能的偏向软引用,因为你不想重新运行一个查询,除非你真的需要。



Answer 4:

该文章有一个伟大的回答这个问题。



Answer 5:

SoftReference的对象不会被收集,直到所有的WeakReference对象已被垃圾回收。

所以把不太重要的对象WeakReference的对象,并使用SoftReference的对象来保存更重要的对象。

鉴于这些事实,你应该使用取决于你在垃圾回收的长期需要很好的参考对象。 该WeakReference的首先收集,然后SoftReference的,最后PhantomReferences。

该文件说:

  • 软引用适用于实现内存敏感的缓存
  • 弱引用适用于实现映射进行规范化不妨碍其键(或值)被回收

顺便说一句,在某些情况下,高速缓存的目的,也可以是使用WeakReference的,而不是因为SoftReference的高速缓存可以在内存中重是一个好主意,所以,需要清洗。

对于幻影,使用是不同的。 他们are for scheduling pre-mortem cleanup actions in a more flexible way than is possible with the Java finalization mechanism.

本文详细阐述一下就可以用幻影的位。



文章来源: When to use Weak and Phantom references in Java