首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:强/软/弱/幻影引用的区别

Java:强/软/弱/幻影引用的区别
EN

Stack Overflow用户
提问于 2012-03-22 00:43:55
回答 6查看 92.7K关注 0票数 197

我读过this article关于Java语言中不同类型的引用(强,软,弱,幻影),但我并不是真的理解它。

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

EN

Stack Overflow用户

发布于 2014-05-07 21:50:30

Java提供了两种不同类型/类的引用对象:。弱参照对象又可进一步分为软参照对象和幻影参照对象。

  • Strong
  • Weak
    • soft
    • phantom

让我们一点一点地来。

强引用对象

代码语言:javascript
运行
复制
StringBuilder builder = new StringBuilder();

这是引用对象的默认类型/类,如果没有指定的话:builder是一个强引用对象。这种引用使得被引用的对象不符合GC的条件。也就是说,每当一个对象被一系列强引用对象引用时,它就不能被垃圾回收。

弱引用对象

代码语言:javascript
运行
复制
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);

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

级别的弱点

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

软引用对象基本上是保留在内存中的弱引用对象:通常,它拒绝GC周期,直到没有内存可用,并且存在OutOfMemoryError的风险(在这种情况下,它可以被删除)。

另一方面,幻影引用对象只有在确切地知道对象何时被有效地从内存中删除时才有用:通常它们用于修复奇怪的finalize()恢复/复活行为,因为它们实际上不返回对象本身,而只是帮助in keeping track of their memory presence

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

票数 156
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9809074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档