当ref不再使用时,为ref赋值是否有任何优势?

时间:2012-01-09 14:54:24

标签: java garbage-collection

我听说指定null explicit的引用将有助于gc收集它。

这是真的吗?

如果一个对象超出范围,它会快速获得gc吗?

5 个答案:

答案 0 :(得分:6)

  

如果一个对象超出范围,它会快速获得gc吗?

一般来说,这是不可能回答的。但是,如果引用即将超出范围,则在它之前将其设置为null几乎肯定无法实现。

另一方面,如果引用变量是长期存在的,那么如果不再需要引用的对象,则将其设置为null可能很有用。

答案 1 :(得分:3)

通常,JVM会在需要时进行垃圾回收,因此将引用赋值为null将无法帮助它更快地发生。

答案 2 :(得分:2)

如果你有一个你打算保留的数组或引用,那么null就可以了。

如果你有一个很长的方法,一个大的对象不会立即超出范围,引用一个大的对象,它可能值null。但是在这种情况下,最好在不再需要对象时分解方法,因此它超出了范围。

答案 3 :(得分:0)

如果这是唯一的引用,则GC可以释放对象正在使用的堆上的空间。但是,如果存在对同一对象的另一个引用,则将第一个引用设置为null将不执行任何操作。第二个引用仍将使对象保持活动状态 - 因此GC不会释放空间。

答案 4 :(得分:0)

通常,如果引用即将超出范围,则不需要显式地将其置空,因为它将很快消失。 我有意识地使用的唯一显式归零或删除引用是:

  1. 关闭与生命周期比该资源更长的对象关联的资源。例如:java.sql.Connection实现通常具有关联的物理连接(例如Socket):当java.sql.Connection关闭时,您可以将此物理连接置空,因为您不再使用它,而实际的java。 sql.Connection将(可能)仍然由用户无限期地持有。 (我使用此示例,因为我是JDBC驱动程序的开发人员,通常这个示例不适用于Java开发人员,但存在类似情况

  2. 在列表或数组结构中处理相对较大的“丢弃”对象。例如:JavaMail库提供了获取消息的方法;这些返回一组消息。如果按顺序处理消息(然后不再需要它们),则在处理后将数组条目置空可能会减少应用程序的内存占用(使用IMAP可以“按需”从服务器加载信息并将其存储在消息中,由于加工而增加其尺寸。)

  3. 可能还有一些其他情况我将显式地使引用为空,但这通常表示不存在对垃圾收集或内存使用的担忧。

    然而一如既往:不要因为你认为它可能有所帮助而为null:如果你知道它会有所帮助,那就是null(所以对代码进行分析,测量内存使用情况等)。如果它是一个爱好应用程序或大学任务:不要打扰。