你们可能会认为在15-20分钟内我就同一主题提出了4-5个问题,所以我可能需要一个关于此问题的教程。但是我通过阅读GC来了解这些问题。
所以我的问题是GC只会在其生命周期中调用一个实例上的finalize()方法,即使相同的对象在其finalize()方法中无法进行垃圾收集。所以我想知道GC将如何知道它在第二次收集它之前已经执行过一次finalize()方法
答案 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