Java:强/软/弱/虚引用之间的区别

新手上路,请多包涵

我读过 这篇 关于 Java 中不同类型引用(强引用、软引用、弱引用、虚引用)的文章,但我并不十分理解。

这些引用类型之间有什么区别,什么时候使用每种类型?

原文由 user1204873 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 367
1 个回答

Java 提供两种不同类型/类的 _引用对象_: 。 Weak Reference Objects 可以进一步分为 softphantom

  • 强的
  • 虚弱的
    • 柔软的
    • 幻影

让我们逐点进行。

强引用对象

StringBuilder builder = new StringBuilder();

这是引用对象的默认类型/类,如果没有不同的指定: builder 是一个强引用对象。这种引用使得被引用的对象不符合GC的条件。也就是说,只要一个对象被 _一连串的强引用对象引用_,它就不能被垃圾回收。

弱引用对象

WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);

弱引用对象不是引用对象的默认类型/类,要使用它们应该像上面的示例一样明确指定。这种引用使得引用对象符合 GC 的条件。也就是说,如果内存中 StringBuilder 对象的唯一引用实际上是弱引用,则允许 GC 对 StringBuilder 对象进行垃圾回收。当内存中的对象只能通过弱引用对象访问时,它自动符合 GC 条件。

弱点等级

可以使用两种不同级别的弱点: 软弱 点和 虚弱 点。

引用对象基本上是一个弱引用对象,它在内存中保留得更多一点:通常,它会抵抗 GC 循环,直到没有内存可用,并且存在 OutOfMemoryError 的风险(在这种情况下,它可以被删除).

另一方面, 幻影 引用对象仅在准确了解对象何时从内存中有效移除时有用:通常它们用于修复 _奇怪的 finalize() 复活/复活行为_,因为它们实际上不返回对象本身,而是只有助于 跟踪他们的记忆存在

弱引用对象是实现缓存模块的理想选择。事实上,只要强引用链不再可以访问对象/值,就可以通过允许 GC 清理内存区域来实现一种自动驱逐。一个例子是 WeakHashMap 保留弱键。

原文由 Paolo Maresca 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题