我对finalization的理解是:
为了清理或回收对象占用的内存,垃圾收集器开始行动。(是否自动调用?)
然后,垃圾收集器取消对该对象的引用。有时,垃圾回收器无法访问对象。然后调用finalize进行最后的清理处理,之后可以调用垃圾收集器。
这是对定稿的准确描述吗?
发布于 2010-03-16 05:23:39
垃圾收集器在后台自动工作(虽然可以显式调用它,但很少需要这样做)。它基本上只清理那些没有被其他对象引用的对象(当然,整体情况更复杂,但这是基本思想)。因此,它不会更改任何活动对象中的任何引用。如果无法从任何活动对象访问对象,这意味着可以安全地对其进行垃圾回收。
终结化意味着清理对象获取的资源(不是内存,而是其他资源,例如文件句柄、端口、数据库连接等)。然而,它并没有真正起作用:-(
finalize()何时会被调用finalize()会被调用!因此,即使它被保证会被调用,它也不是释放资源的好地方:当它被调用来释放您打开的所有数据库连接时,系统可能已经完全用完了空闲连接,并且您的应用程序不再工作。
发布于 2010-03-16 05:26:23
来自this article
finalizable任何实现
()方法的类的实例通常被称为finalizable对象。当它们不再被引用时,Java垃圾收集器不会立即回收它们。取而代之的是,Java垃圾收集器将对象附加到一个特殊的队列中,用于终结过程。通常,它是由一些Java虚拟机上称为“引用处理程序”的特殊线程执行的。在这个finalize过程中,"Finalizer“线程将执行对象的每个finalize()方法。只有在finalize()方法成功完成之后,才会将一个对象移交给Java垃圾回收,以便通过“未来的”垃圾回收回收其空间。
实际上,您可以在类的finalize()方法中自由执行任何操作。这样做时,请不要期望当对象不再被引用或不再需要时,Java垃圾收集器会回收每个对象占用的内存空间。为什么?不能保证finalize()方法会及时完成执行。最坏的情况是,即使不再有对对象的引用,它也可能不会被调用。这意味着不能保证任何具有finalize()方法的对象都会被垃圾回收。
此外,来自Sun的this article有一些很好的图表来解释这一过程。
发布于 2010-03-16 05:24:43
不是的。只有当垃圾回收器试图回收您的对象时,才运行finalize()方法。
你的对象使用的任何内存都会(通常,我想不出异常)自动连接到你的对象,并与之一起清除。因此,Finalization并不是为了释放内存,而是为了释放您的对象可能关联的任何其他资源。例如,这可以用于关闭打开的文件或数据库连接,或者可能运行一些与操作系统交互的低级代码以释放一些系统级资源。
https://stackoverflow.com/questions/2450580
复制相似问题