【问题标题】:Is there any advantage to assign null to a ref when it is no longer used?不再使用时将 null 分配给 ref 有什么好处吗?
【发布时间】:2012-02-06 02:21:22
【问题描述】:

我听说分配对 null 显式的引用将有助于 gc 收集它。

这是真的吗?

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

【问题讨论】:

标签: java garbage-collection


【解决方案1】:

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

一般来说这是无法回答的。但是,如果引用即将超出范围,那么在它发生之前将其设置为 null 几乎肯定不会有任何效果。

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

【讨论】:

    【解决方案2】:

    通常,JVM 会在需要时进行垃圾收集,因此分配对 null 的引用不会帮助它更快地发生。

    【讨论】:

      【解决方案3】:

      如果您有想要保留的数组或引用,则值得nulling 出来。

      如果您有一个包含不会立即超出范围的大对象的长方法,请引用一个大对象,它可能值得nulling 出来。但是在这种情况下,最好在不再需要对象的地方分解方法,这样它就会超出范围。

      【讨论】:

        【解决方案4】:

        如果这是唯一的引用,那么 GC 可以释放对象正在使用的堆上的空间。但是,如果有另一个对同一个对象的引用,那么将第一个引用设置为 null 将无济于事。第二个引用仍会使对象保持活动状态 - 因此 GC 不会释放空间。

        【讨论】:

          【解决方案5】:

          一般来说,如果引用即将超出范围,则无需显式将其设为 null,因为它很快就会消失。 我有意识地使用的唯一明确的无效或删除引用是:

          1. 关闭与生命周期比该资源更长的对象关联的资源。例如:java.sql.Connection 实现通常有一个关联的物理连接(例如 Socket):当 java.sql.Connection 关闭时,您可以将该物理连接设为空,因为您不再使用它,而实际的 java.sql.Connection 实现通常具有关联的物理连接。 sql.Connection 将(可能)仍由用户无限期持有。 (我使用这个例子是因为我是一个JDBC驱动的开发者,一般Java开发者不会出现这个例子,但也有类似的情况

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

          可能在其他一些情况下,我会明确地将引用设为空,但这通常表示某些东西不可用,而不是出于对垃圾收集或内存使用的担忧。

          但是,一如既往:不要仅仅因为您认为它会有所帮助而为 null:如果您知道它会有所帮助,则为 null(因此分析代码,测量内存使用情况等)。如果是临时爱好申请或大学作业:不要打扰。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-24
            • 2015-04-12
            • 1970-01-01
            • 2021-05-04
            • 1970-01-01
            • 2014-10-26
            相关资源
            最近更新 更多