Java 有人能解释强引用、软引用、弱引用和虚引用之间的区别及其用法吗?

Java 有人能解释强引用、软引用、弱引用和虚引用之间的区别及其用法吗?,java,reference,Java,Reference,我一直在试图理解不同参考文献之间的差异,但该理论并没有激发任何想法让我将其形象化 有人能简要解释一下不同的参考资料吗 每一个例子都会更好。一篇解释这些参考类型的文章(包括例子):关于这个主题的另一篇好文章: ,有漂亮的图表 摘录: 正如您可能猜到的,向对象生命周期图添加三个新的可选状态会造成混乱。 尽管文档指出了从强可达到软、弱和幻影到回收的逻辑过程,但实际过程取决于程序创建的引用对象。 如果创建软引用,但不创建软引用,则对象将直接从强可达到弱可达到最终确定到收集。对象生命周期,带有参考对象

我一直在试图理解不同参考文献之间的差异,但该理论并没有激发任何想法让我将其形象化

有人能简要解释一下不同的参考资料吗


每一个例子都会更好。

一篇解释这些参考类型的文章(包括例子):

关于这个主题的另一篇好文章:
,有漂亮的图表

摘录:

正如您可能猜到的,向对象生命周期图添加三个新的可选状态会造成混乱。
尽管文档指出了从强可达到软、弱和幻影到回收的逻辑过程,但实际过程取决于程序创建的引用对象。
如果创建
软引用
,但不创建
软引用
,则对象将直接从强可达到弱可达到最终确定到收集。对象生命周期,带有参考对象

记住,并非所有对象都附加到引用对象上,这一点也很重要-事实上,很少有对象应该是
引用对象是一个间接层:您通过引用对象到达引用对象,显然您不希望在整个代码中使用该间接层。
事实上,大多数程序将使用引用对象访问程序创建的相对较少的对象

引用和引用

引用对象在程序代码和其他对象(称为referent)之间提供了一层间接层。
每个引用对象都围绕其引用对象构造,并提供一个get()方法来访问引用对象。创建引用后,不能更改其referent。收集引用对象后,get()方法返回null。应用程序代码、软/弱引用和引用之间的关系


还有更多的例子:

  • 案例1:这是一个常规案例,其中对象被称为强可达

  • 案例2:有两条到对象的路径,因此选择最强的路径,即具有强引用的路径,因此对象是强可访问的

  • 案例3:同样有两条路径指向该对象,最强的一条是弱引用(因为另一条是幻影引用),因此该对象被称为弱可达

  • 案例4:只有一条路径,最薄弱的环节是弱引用,因此对象是弱可达的

  • 案例5:只有一条路径,最薄弱的环节是幻影引用,因此对象是幻影可及的

  • 案例6:现在有两条路径,最强的路径是具有软引用的路径,因此现在称对象是软可到达的


有一个非常简单的规则:

  • 强引用对象是标准的代码位,如
    objecta=newobject()
    。只要引用(
    a
    ,上面)是“可访问的”,那么被引用的对象就不是垃圾。因此,任何没有可到达的强引用的东西都可以被视为垃圾
然后我们来看看非强引用类型:

  • 弱引用的对象可能会在符合GC条件时被JVM收集(并且
    WeakReference
    被清除)。对
    A
    的弱引用看起来像
    newweakreference(A)
    。弱引用在需要缓存的情况下非常有用,因为只有在其他地方(例如HttpSessions)可以强访问密钥时,才需要缓存数据
  • 软引用的对象可能会挂在JVM中,直到它完全需要恢复内存。软引用对于缓存非常有用,因为缓存中的值是长期存在的,但在必要时可以收集这些值

我从来都不太确定幻影

+1不只是提供URL:)之后,使用不同的gc模式:Java编程:References’包解释了我想要什么。现在我对参考文献有了一个清晰的概念。很高兴你喜欢这篇文章:-)在我的404中看到了链接report@kdgregory:谢谢你的更新:)这篇文章确实很棒。相关但范围较窄:链接断开。这就是为什么我们应该引用页面内容而不是提供链接的原因。