Java 重写对象类的finalize()方法有什么用?

Java 重写对象类的finalize()方法有什么用?,java,garbage-collection,Java,Garbage Collection,据我所知,在java中,如果我们想手动调用垃圾收集器,我们可以执行System.gc() 1.我们在重写的finalize()方法中执行哪些操作? 2.如果要手动调用JVM垃圾收集器,是否需要重写finalize()方法 1.我们在重写的finalize()方法中执行哪些操作 清理垃圾回收无法处理的资源 2.如果要手动调用JVM垃圾收集器,是否需要重写finalize()方法 不,这两件事是不相关的 finalize当然不应该调用垃圾收集器本身。事实上,finalize是由垃圾收集器调用的(但并

据我所知,在java中,如果我们想手动调用垃圾收集器,我们可以执行System.gc() 1.我们在重写的finalize()方法中执行哪些操作?
2.如果要手动调用JVM垃圾收集器,是否需要重写finalize()方法

1.我们在重写的finalize()方法中执行哪些操作

清理垃圾回收无法处理的资源

2.如果要手动调用JVM垃圾收集器,是否需要重写finalize()方法

不,这两件事是不相关的


finalize当然不应该调用垃圾收集器本身。事实上,finalize是由垃圾收集器调用的(但并不保证会被调用)。

如果需要手动释放资源(特别是那些如果没有释放就会使用大量内存或导致锁定的资源),通常会覆盖finalize方法。例如,如果有一个对象在文件或数据库表上具有锁,则可能需要重写finalize方法,以便在对象被垃圾收集时释放这些对象


至于是否需要覆盖finalize,则绝对不是。您可以调用System.gc(),而无需重写finalize方法。不过,需要注意的是,调用System.gc()并不一定意味着垃圾收集器将执行任何操作。把它看作是JVM运行垃圾收集的一个“推荐”,而不是一个“任务”。

< p>对于非常罕见的情况,实现<代码>最终完成对于释放分配的资源可能是有用的或必要的。当实例最终被销毁时,总是调用此方法

如果您使用本机代码并且需要释放本机代码区域中分配的资源,则可能会有所帮助

但是要小心使用它,因为最终实现
将大大降低垃圾收集器的速度并降低性能。

1)在对象销毁时要进行的任何清理(例如,如果您保持一些句柄打开,并且没有人调用显式关闭)。请记住,您不知道何时会发生这种情况,因为JVM将调用GC,而不是您

2) 没有


请注意,您不应该手动调用垃圾收集器,请参见此处的答案,

不能保证会立即调用终结器,因此您不应该在finalize方法中执行任何关键操作

  • 如果系统资源(如IOStreams)尚未关闭或释放,则将其作为安全网释放
  • 在GC不知道的本机代码中释放系统资源

  • 其他人已经解释了finalize方法

    但是请注意,最佳实践是设计一个“关闭”/“清理”/“终止”方法来关闭/清理对象,并要求开发人员显式调用此方法。终结器只能用作安全网。(参见Joshua Bloch的“有效Java”中的“第7项:避免终结器”)

    更新:

    在这种情况下也考虑实现以资源块来支持尝试。

    我们在重写的finalize()方法中执行哪些操作

    手动分配的可用内存(通过一些本机调用),即不由GC管理。这是一种非常罕见的情况。 有些人还检查了与该对象连接的其他资源是否已被释放,但这只是为了调试目的,不太可靠。
    你必须记住:

  • finalize
    是关于内存和唯一内存的
  • 您无法控制何时调用它,甚至无法控制是否调用它
  • 因此,永远不要在那里释放任何其他资源(如文件句柄、锁)。所有这些资源都必须手动释放。

    重写finalize与调用
    System.gc()

    @Andreas\D:我同意reef的说法,他暗示的是,如果finalize()包含使当前实例不符合gc条件的代码,即通过给一个活动线程一个对该实例的引用使其恢复生命,然后,下次该实例符合GC条件时,不要期望JVM再次调用finalize()。就JVM而言,它通过一次调用finalize()完成了自己的职责,并且不会因为您不断地使实例恢复生命而一次又一次地调用finalize()。如果它这样做了,那么该对象将永远不会被GC’ed(当然,您可能希望该实例永远不会被GC’ed。然后让一个活动线程维护对它的引用。如果没有任何活动线程对该实例进行引用,那么该实例就如同死了一样。)

    我一直听说不能保证将调用finalize(),但是,Java在长时间运行的程序中不会为对象调用finalize()的可能性有多大,除非JVM在运行之前关闭了它。。。或者这应该是一个单独的问题?它至少会被调用一次。去年我向JBoss报告了一个bug,因为我的文件句柄快用完了。他们在finalize()方法中关闭了他们的文件资源,我在finalize被调用之前就用完了。它可以归结为应用程序大小、内存设置和行星排列。记住这可能不会发生是件好事,也许一个明确的结束会更好。不。它可能永远不会被调用。在
    finalize
    方法中释放句柄是一个编程错误。当不再需要它们时,应该手动重新设置它们的编号(
    try finally
    用于清理资源)@Tadeusz哇,实际上你是对的。通过java.lang.Shutdown,您必须显式地告诉JVM在退出时运行终结器。所以他们可能根本就不会被叫来!在上次GC和关机之间的那些将不会运行