你们可能会认为,在15-20分钟内,我已经问了4-5个关于同一主题的问题,所以我可能需要一个关于这个的教程。但我是通过阅读GC得到这些问题的。
所以我的问题是,即使同一个对象在其finalize()方法中不符合垃圾收集的条件,GC也只会在实例的生命周期中调用finalize()方法一次。所以我想知道GC在第二次收集finalize()方法时如何知道它已经执行过finalize()方法
发布于 2010-02-05 03:56:12
老实说,如果你忘记了终结器的存在,你的生活会好很多。我编写Java已经有很多年了,从来没有理由使用终结器。
他们很慢,没有明确的定义(有时他们永远不会跑!),而且通常是皮塔。
如果您正在管理外部资源,请执行类似于Closeable接口的操作,并使用try{} finally{}块进行清理。否则,尽您所能地相信该语言会在其自身之后清理内存。
发布于 2010-02-05 03:43:24
依赖于实现。假设VM在每个对象上都有一个保密位,或者有一个包含已经“完成”的对象的表。如果我必须猜测,我会说后者,因为假设仍然存在的已经完成的对象集预计会很小,所以在系统中的每个对象上设置一点似乎有点浪费。
发布于 2010-02-05 03:48:50
又是你:)
请注意,在终结器的主题上,如果您确实使用JVMTI的ForceGargabeCollection强制强制执行GC,则需要特别说明:a GC:
“此函数不会导致运行终结器。”
再说一次,你可能并不是真的想这么做,但是如果你有JVMTI和5个关于GC的问题,你会认为不断重复使用2K+的ForceGarbageCollection是很有趣的,你真的可以一个GC。
强制GC的权威信息:
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
https://stackoverflow.com/questions/2202557
复制相似问题