【发布时间】:2012-02-06 02:21:22
【问题描述】:
我听说分配对 null 显式的引用将有助于 gc 收集它。
这是真的吗?
如果一个对象超出范围,它会很快得到 gc 吗?
【问题讨论】:
我听说分配对 null 显式的引用将有助于 gc 收集它。
这是真的吗?
如果一个对象超出范围,它会很快得到 gc 吗?
【问题讨论】:
如果一个对象超出范围,它会很快得到 gc 吗?
一般来说这是无法回答的。但是,如果引用即将超出范围,那么在它发生之前将其设置为 null 几乎肯定不会有任何效果。
另一方面,如果引用变量是长期存在的,那么在不再需要引用的对象时将其设置为 null 可能会很有用。
【讨论】:
通常,JVM 会在需要时进行垃圾收集,因此分配对 null 的引用不会帮助它更快地发生。
【讨论】:
如果您有想要保留的数组或引用,则值得nulling 出来。
如果您有一个包含不会立即超出范围的大对象的长方法,请引用一个大对象,它可能值得nulling 出来。但是在这种情况下,最好在不再需要对象的地方分解方法,这样它就会超出范围。
【讨论】:
如果这是唯一的引用,那么 GC 可以释放对象正在使用的堆上的空间。但是,如果有另一个对同一个对象的引用,那么将第一个引用设置为 null 将无济于事。第二个引用仍会使对象保持活动状态 - 因此 GC 不会释放空间。
【讨论】:
一般来说,如果引用即将超出范围,则无需显式将其设为 null,因为它很快就会消失。 我有意识地使用的唯一明确的无效或删除引用是:
关闭与生命周期比该资源更长的对象关联的资源。例如:java.sql.Connection 实现通常有一个关联的物理连接(例如 Socket):当 java.sql.Connection 关闭时,您可以将该物理连接设为空,因为您不再使用它,而实际的 java.sql.Connection 实现通常具有关联的物理连接。 sql.Connection 将(可能)仍由用户无限期持有。 (我使用这个例子是因为我是一个JDBC驱动的开发者,一般Java开发者不会出现这个例子,但也有类似的情况)
处理列表或数组结构中相对较大的“丢弃”对象。例如:JavaMail 库提供了获取消息的方法;这些返回一组消息。如果您按顺序处理消息(然后不再需要它们),则在处理后将数组条目清空可以减少应用程序的内存占用(使用 IMAP,它可以“按需”从服务器加载信息并将其存储在消息中,由于处理而增加其大小)。
可能在其他一些情况下,我会明确地将引用设为空,但这通常表示某些东西不可用,而不是出于对垃圾收集或内存使用的担忧。
但是,一如既往:不要仅仅因为您认为它会有所帮助而为 null:如果您知道它会有所帮助,则为 null(因此分析代码,测量内存使用情况等)。如果是临时爱好申请或大学作业:不要打扰。
【讨论】: