jvm回收内存之前,会调用finalize()方法,如果该方法调用失败,jvm是否会继续释放内存?
或者说,super.finalize()方法底层做了什么样的工作?求解答
首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
如下图Object的finalize方法。抛出异常后会被忽略,不会影响jvm的内存回收;并且方法内没有做任何逻辑。
自己可以在重写finalize方法,在方法里面让对象变的可达(可达就不解释了)。finalize方法只会被执行一次,就是说一第二次回收的时候就不执行finalize方法,直接回收。
不一定会成功 即使是调用了方法
你可以强制在析构函数(finalize)里丢出一个异常,故意让它失败,那么这个对象就没法回收了,会一直放在内存堆上。
当然,在现实中,要尽量避免析构中丢出异常,所以这种情况在代码编写良好的程序中非常罕见。
会成功,只是 回收的快慢而已
不会 它会先调用finalize方法
不一定,只有当内存不够用的时候,jvm才会启用gc机制。在调用gc之前,会调用finalize 方法。
所以,jvm在内存够用的情况下,是不会消耗自己的内存去运行jvm的gc,因为gc也是一个进程,同样会占用内存,这无疑会拖慢程序运行的速度。
会释放掉的