2010-01-06 59 views

回答

21

的话题另一个好文章:
Java Reference Objects or How I Learned to Stop Worrying and Love OutOfMemoryError,与漂亮的图表

http://www.kdgregory.com/images/java.refobj/object_life_cycle_with_refobj.gif

提取物:

正如您可能猜到的那样,将第三个新的可选状态添加到第e对象生命周期图使得混乱。
尽管文档显示从强烈可达到柔软,虚弱和幻影的逻辑进展到回收,但实际进度取决于程序创建的参考对象。
如果您创建WeakReference但不创建SoftReference,则对象直接从强可达性进展为弱可达性以最终确定收集。对象的生命周期,参考对象

重要的是要记住,不是所有的对象都连接到参考对象也很重要 - 事实上,他们很少应该是
引用对象是一个间接层:你通过引用对象到达引用对象,显然你不希望在你的代码中间接寻找一层间接引用。
实际上,大多数程序将使用引用对象来访问程序创建的相对较小数量的对象。

参考和所指

的参考对象提供你的程序代码和其他一些物体之间间接层,叫做所指对象。
每个引用对象都围绕其指示对象构建,并提供一个get()方法来访问指示对象。一旦你创建了一个参考,你不能改变它的参考。一旦收集到对象,get()方法返回null。 Java Programming: References' Package

alt text http://www.pabrantes.net/blog/space/start/2007-09-16/1/referenceTypes.png

  • 案例1::这是常规

    alt text


    甚至更​​实例的应用程序代码,软/弱引用,和指示对象之间的关系据说Object被认为是强烈可达的情况。情况2:有两条通往对象的路径,所以选择最强的一条路径,这是具有强引用的路径,因此该对象是强烈可达的。案例3:再次有两条路径通往对象,其中最强的一条是弱引用(因为另一条是幻影引用),所以该对象被认为是弱可达的。案例4:只有一条路径,最薄弱的环节是一个弱引用,所以该对象是弱可达的。情况5:只有一条路径和最弱的环节是幻影参考,因此该对象是幻象可达的。案例6:现在有两条路径,最强的路径是带有软引用的路径,所以现在这个对象被认为是可以轻松访问的。

+1

+1不只是提供一个网址:) – 2010-01-06 12:45:42

+0

之后,玩不同的gc模式:http://www.artima.com/insidejvm/ed2/gcP.html – VonC 2010-01-06 12:55:58

+0

Java编程:参考资料'包解释了我什么我想了。现在我对引用是什么有清晰的认识。 – 2010-01-06 13:50:31

3

有一个非常简单的规则:

  • 强引用的对象是像Object a = new Object()编码标准位。 参考对象只要参考(上面的a)是“可到达的”就不是垃圾。因此任何没有可达到的强引用可以被视为垃圾

那么接下来我们就来看看非强引用类型:

  • 弱引用对象可能会得到由JVM只要他们有资格GC收集(和WeakReference清除)。对a的弱引用看起来像new WeakReference<Object>(a)。弱引用在你想要一个缓存的情况下非常有用,只有当密钥存在于其他地方(例如HttpSession)时,才需要数据(如HttpSessions)
  • 软引用对象可能会在JVM中一直存在,直到它绝对需要恢复内存。软参考对于值长且可以收集的高速缓存很有用

我从来没有太确定幻影!

相关问题