面试题答案
一键面试三色含义
- 白色:代表尚未被垃圾回收器访问到的对象。在垃圾回收开始阶段,所有对象默认都是白色。如果在垃圾回收结束时,某个对象仍为白色,那么这个对象就会被判定为垃圾,可以被回收。
- 灰色:代表已经被垃圾回收器访问到的对象,但是这些对象引用的其他对象还没有被全部访问。灰色对象是垃圾回收器下一步要处理的对象集合。
- 黑色:代表已经被垃圾回收器访问到,并且其引用的所有对象也都被访问过的对象。黑色对象在本轮垃圾回收中是安全的,不会被回收。
标记和清理过程
- 初始化:在垃圾回收开始时,所有对象都是白色。根对象(例如全局变量、栈上的变量等)会被标记为灰色,放入待处理队列。
- 标记阶段:
- 垃圾回收器从灰色队列中取出一个灰色对象,将其标记为黑色。
- 遍历该黑色对象引用的所有白色对象,将这些白色对象标记为灰色,并放入灰色队列。
- 重复上述过程,直到灰色队列为空。此时,所有可达对象都被标记为黑色,而白色对象就是不可达对象(垃圾)。
- 清理阶段:垃圾回收器会遍历堆内存,回收所有白色对象占用的内存空间,并将这些内存空间标记为可用,供后续程序分配使用。同时,将所有对象重新标记为白色,为下一次垃圾回收做准备。