标签:
首先: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方法
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/q35445762/article/details/46918973