jvm回收内存一定会成功吗? 5C

jvm回收内存之前,会调用finalize()方法,如果该方法调用失败,jvm是否会继续释放内存?
或者说,super.finalize()方法底层做了什么样的工作?求解答

8个回答

首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

qq_42498910
qq_42498910 首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
一年多之前 回复
liu1246734032
路易錯丶太執著 finalize方法不一定会执行吧
一年多之前 回复

如下图Object的finalize方法。抛出异常后会被忽略,不会影响jvm的内存回收;并且方法内没有做任何逻辑。
自己可以在重写finalize方法,在方法里面让对象变的可达(可达就不解释了)。finalize方法只会被执行一次,就是说一第二次回收的时候就不执行finalize方法,直接回收。
图片说明

不一定会成功 即使是调用了方法

你可以强制在析构函数(finalize)里丢出一个异常,故意让它失败,那么这个对象就没法回收了,会一直放在内存堆上。
当然,在现实中,要尽量避免析构中丢出异常,所以这种情况在代码编写良好的程序中非常罕见。

会成功,只是 回收的快慢而已

图片说明

不会 它会先调用finalize方法

不一定,只有当内存不够用的时候,jvm才会启用gc机制。在调用gc之前,会调用finalize 方法。
所以,jvm在内存够用的情况下,是不会消耗自己的内存去运行jvm的gc,因为gc也是一个进程,同样会占用内存,这无疑会拖慢程序运行的速度。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!