垃圾收集器和finalize()方法

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

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

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

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

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

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

啊你又来了:)

请注意,关于终结器的主题,如果您真的使用JVMTI的ForceGargabeCollection强制GC,则具体说明:

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

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

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

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