Java中的finalize方法理解

首先:system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的。

其次:对象被回收时,要经过两次标记,第一次标记,如果finalize被重写,或者finalize被调用过,那么垃圾回收并不会去执行finalize,第二次标记,如果对象不能在finalize中成功拯救自己,那真的就要被回收了。

咱们用的虚拟机一般都是sun的hotspot,以下描述都是针对hotspot虚拟机,当然其他虚拟机也差不多,

,,他是根据跟搜索算法判断哪些垃圾需要回收

GCROOT就是跟,,垃圾回收又分为新生代和老生代,你刚new的对象,占用的内存也不会超过

直接进入老生代的标准,,因为可以存活下来的对象很少,,,所以新生代采用复制的算法,,

如果你的对象实例没有到达这个跟的引用链,,那么就会被标记为要回收的对象,新生代的内存

模型分为eden space和s0以及s1,,被标记为要清除的对象后,会进行筛选,如果这个对象没被调用过

finalize方法并且重写了finalize方法,,那么就会把这个对象加入一个叫F-queue的队列中,然后

虚拟机会启动一个优先级较低的finalizer线程去执行这个对象的finalize方法,如果在这些方法结束之前

这个对象又有了一个引用链到达gc root 那么 这个对象这次就是自救成功了, 垃圾收集器不会手收集他,,

当然同一个对象实例的finalize方法只会被调用一次,也就是说只有一次自救机会。

所以被调用有三种情况
1. 对象失效后,被立刻回收,此时finalize方法被调用。
2. 在E、S0、S1或者O区中的时候,所处堆区达到100%,该区已经失效的所有对象被回收,会触发finalize方法。
3. P区达到100%,jvm中断当前所有进程,回收所有已经失效的对象,触发finalize方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值