Java虚拟机垃圾收集

2020-03-10  本文已影响0人  睦月MTK

statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激


一、垃圾收集过程简述

虚拟机的垃圾收集过程大致可以分为以下几步:

  1. 找出需要被收集的对象
  2. 如果被收集的对象没有执行过finalize方法,则将其加入到F-Queue队列中等待被执行finalize方法
  3. 根据不同的收集算法,进行真正的垃圾收集

二、标记阶段

标记阶段的作用就是找出Java堆中哪些对象时需要被收集的并标记,以便虚拟机收集。判断需要被收集的对象有两种算法:


三、finalize方法执行阶段

如果一个被标记的对象没有执行过finalize方法且finalize方法是被重写过的,则虚拟机会将这个对象加入F-Queue队列中,等待被执行finalize方法,需要注意的是,finalize方法不一定会执行完全,因为有一个超时时间,所以这也是为什么不建议使用finalize方法来达成类似析构函数的作用。如果在执行finalize方法时重新将该被标记的对象链接到任意一个没有被标记对象上,那么该对象在下一次标记时就会被取消标记,这样这个对象就被“救活了”。但是毕竟finalize只会执行一次,所以救命行为也就只有一次。


四、垃圾收集阶段

垃圾收集阶段才是真正的开始对无用对象进行销毁的阶段,实现该目的的算法有很多种:


五、其他

参考文档:
[1] [深入理解Java虚拟机 -- 周志明]

上一篇 下一篇

猜你喜欢

热点阅读