码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的finalize方法理解

时间:2015-07-17 00:31:53      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

首先: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方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中的finalize方法理解

标签:

原文地址:http://blog.csdn.net/q35445762/article/details/46918973

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!