Vla*_*sov 8 java weak-references phantom-reference soft-references
我阅读了很多文章,但我不明白 - 在实践中我需要在哪里使用Weak和Phantom参考?软错误引用 - 正如我所理解的那样,是缓存的不错选择.但弱和幻影,我不知道何时使用.请提供我们需要使用它们的实际任务的示例.
您可以使用弱引用缓存,就像您所说的软引用一样.
PhantomReferences有什么用?我只知道它们有两个严重的情况:首先,它们允许您确定何时从内存中删除对象.事实上,它们是确定这一点的唯一方法.这通常不是很有用,但在某些非常特殊的情况下可能会派上用场,例如操作大图像:如果你确定图像应该被垃圾收集,你可以等到它实际上是在尝试加载下一个图像之前,因此不太可能使可怕的OutOfMemoryError.
其次,PhantomReferences避免了最终化的基本问题:finalize()方法可以通过创建对它们的新的强引用来"复活"对象.那么,你说什么?好吧,问题是现在必须确定覆盖finalize()的对象至少在两个单独的垃圾收集周期中是垃圾才能被收集.当第一个周期确定它是垃圾时,它有资格完成.由于在完成期间对象被"复活"的(微小的,但不幸的是真实的)可能性,垃圾收集器必须在实际移除对象之前再次运行.并且由于最终确定可能没有及时发生,因此在对象等待最终确定时可能会发生任意数量的垃圾收集周期.这可能意味着实际清理垃圾对象的严重延迟,这就是为什么即使大部分堆都是垃圾也可以获得OutOfMemoryErrors.
有关详细信息,请参阅此页:http: //weblogs.java.net/blog/2006/05/04/understanding-weak-references
基本上,当您想要将一些其他数据与源代码不受您控制的对象相关联时,您将使用弱引用.通过使用弱引用,您可以将元对象的生命周期耦合到主对象的生命周期.
幻像引用的主要用例是实现自己的终结器线程,而没有与默认机制相关联的危险,这种机制被强制引用对终结代码可访问的所谓无法访问的对象.
软补率主要用于缓存,但正如在另一篇文章中所述,它们在实践中可能会产生相当大的灾难性影响,从而破坏了缓存的重点.一个主要的GC(将清除你的Soft refs的那个)通常不会发生,直到你的应用程序的性能压力上升.这是您最需要缓存的时间,以及您最有可能丢失缓存的时间 - 一次性完成.
| 归档时间: |
|
| 查看次数: |
5048 次 |
| 最近记录: |