Java 当我们显式调用finalize()时,对象内存是否被释放?
就我的理解而言,finalize()和GC是两个不同的方面。GC使用finalize()方法释放对象内存。我们无法说明何时将发生GC(即使显式调用System.GC())。但是我们可以对对象显式调用finalize()Java 当我们显式调用finalize()时,对象内存是否被释放?,java,garbage-collection,jvm,finalizer,Java,Garbage Collection,Jvm,Finalizer,就我的理解而言,finalize()和GC是两个不同的方面。GC使用finalize()方法释放对象内存。我们无法说明何时将发生GC(即使显式调用System.GC())。但是我们可以对对象显式调用finalize() Will the function be executed immediately(memory freed) or it waits till GC occurs like System.gc() call? 另外,根据文档,Java虚拟机对任何给定对象调用finalize方
Will the function be executed immediately(memory freed) or it waits till GC
occurs like System.gc() call?
另外,根据文档,Java虚拟机对任何给定对象调用finalize方法的次数不会超过一次
那么,当我们首先调用finalize()并在稍后的时间点执行GC时会发生什么呢
If object memory is not freed on explicit call to object.finalize() then would't
it being called again in the GC process violate the calling only once rule?
你完全弄错了 简短答复:
finalize()
是一种在对象准备进行垃圾收集之前(当没有对象对其具有强引用时)清理资源(如打开的文件)的方法。它可能被称为/不被称为。这比内存释放提前了一步
长答覆:
有一个单独的守护进程线程称为finalizer线程,负责调用finalize()方法。Finalization queue是放置准备好调用finalize()方法的对象的队列
- 2a)如果没有,则发送垃圾回收 2b)它是has,然后它被添加到终结队列中。并从表(1)中删除对象的条目
但是,您不能强制GC运行,您可以通过
System.GC()
请求它。所以,最好的方法是在重写时将释放资源的代码放入finalize()
方法。答案在Object.finalize API中
1) GC调用finalize(),因此finalize()和GC不是两个不同的方面
2) 您不应该手动调用finalize,但如果您这样做,它将不会释放任何内存,也不会影响GC行为
3) 据说GC保证不会调用finalize两次,我们的调用不算@duffymo不算太多…因此我们不能对任何对象显式调用finalize(),即使我们这样做,它也只会在GC发生时执行。是吗?如果你想打电话,你就一直打。但这根本不可取。如果您调用它,它将像任何其他方法调用一样执行。GC调用稍后会调用它(尽管它可能会出现,也可能不会出现)。阅读上面的更多内容info@Jatin-+1(特别是第一句),但请检查我的编辑。您描述了finalize()的功能,我描述了为什么有人认为他们需要它。语句“JVM检查对象是否有finalize()方法”是什么意思?所有对象都有finalize()方法,因为所有扩展对象类都有finalize()方法?该规范有一个“普通”finalizer的概念,即a)由
java.lang.Object
声明的finalize()
方法,b)空的finalize()
方法,或c)由唯一的super.finalize()组成的finalize()
调用另一个简单的finalize方法。因此,当一个对象被创建时,JVM会检查它的类是否有一个finalize方法是“不平凡的”。仍然依赖于JVM,但这基本上就是答案
Basically finalize() method is only called once.