我读过 这篇 关于 Java 中不同类型引用(强引用、软引用、弱引用、虚引用)的文章,但我并不十分理解。
这些引用类型之间有什么区别,什么时候使用每种类型?
原文由 user1204873 发布,翻译遵循 CC BY-SA 4.0 许可协议
我读过 这篇 关于 Java 中不同类型引用(强引用、软引用、弱引用、虚引用)的文章,但我并不十分理解。
这些引用类型之间有什么区别,什么时候使用每种类型?
原文由 user1204873 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
Java 提供两种不同类型/类的 _引用对象_: 强 和 弱。 Weak Reference Objects 可以进一步分为 soft 和 phantom 。
让我们逐点进行。
强引用对象
这是引用对象的默认类型/类,如果没有不同的指定:
builder
是一个强引用对象。这种引用使得被引用的对象不符合GC的条件。也就是说,只要一个对象被 _一连串的强引用对象引用_,它就不能被垃圾回收。弱引用对象
弱引用对象不是引用对象的默认类型/类,要使用它们应该像上面的示例一样明确指定。这种引用使得引用对象符合 GC 的条件。也就是说,如果内存中
StringBuilder
对象的唯一引用实际上是弱引用,则允许 GC 对StringBuilder
对象进行垃圾回收。当内存中的对象只能通过弱引用对象访问时,它自动符合 GC 条件。弱点等级
可以使用两种不同级别的弱点: 软弱 点和 虚弱 点。
软 引用对象基本上是一个弱引用对象,它在内存中保留得更多一点:通常,它会抵抗 GC 循环,直到没有内存可用,并且存在
OutOfMemoryError
的风险(在这种情况下,它可以被删除).另一方面, 幻影 引用对象仅在准确了解对象何时从内存中有效移除时有用:通常它们用于修复 _奇怪的 finalize() 复活/复活行为_,因为它们实际上不返回对象本身,而是只有助于 跟踪他们的记忆存在。
弱引用对象是实现缓存模块的理想选择。事实上,只要强引用链不再可以访问对象/值,就可以通过允许 GC 清理内存区域来实现一种自动驱逐。一个例子是 WeakHashMap 保留弱键。