垃圾收集器和finalize()方法

时间:2010-02-04 19:31:55

标签: java

你们可能会认为在15-20分钟内我就同一主题提出了4-5个问题,所以我可能需要一个关于此问题的教程。但是我通过阅读GC来了解这些问题。

所以我的问题是GC只会在其生命周期中调用一个实例上的finalize()方法,即使相同的对象在其finalize()方法中无法进行垃圾收集。所以我想知道GC将如何知道它在第二次收集它之前已经执行过一次finalize()方法

3 个答案:

答案 0 :(得分:4)

老实说,如果你忘记了终结者的存在,你的生活将会好得多。我已经编写Java多年了,从来没有理由使用终结器。

它们很慢,没有明确定义(有时它们永远不会运行!),通常是PITA。

如果您正在管理外部资源,请执行Closeable接口的操作,并使用try {} finally {}块进行清理。否则,尽可能多地尝试信任语言来清理内存。

答案 1 :(得分:1)

依赖于实施。据推测,VM要么在每个对象上都有一个秘密位,要么有一个包含已经“完成”的对象的表。如果我不得不猜测,我会说后者,因为大概已经停止的已经完成的对象集合预计会很小,所以在系统中的每个对象上都有点浪费。

答案 2 :(得分:0)

啊你又来了:)

请注意,关于终结器的主题,如果您真的 FORCE 使用JVMTI的ForceGargabeCollection,那么具体说明:

“此功能不会导致终结器运行。”

再一次,你可能真的不想这样做,但是如果你有2K + rep和5个关于GC的问题,那么认为使用JVMTI的ForceGarbageCollection继续重复这个问题很有意思你可以 FORCE 一个GC。

关于如何强制GC的权威信息:

http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection