为啥写这篇文章
最近面试的时候面试官会问些GC(Garbage Collection)的问题,除了标记清除比较好说之外,感觉其他的都比较难说清除,真是急煞我也。
想了好久,觉得之所以标记清除之所以比较好理解是因为讲述者的比喻非常形象:“给每个客人发一张卫生纸(别想多了),然后记录下客人的名单,要回收的时候就去问客人需不需要,把需要的标记成1,不需要的标记为0,然后逐个回收不需要的卫生纸”,多清晰!至于客人需不需要,那就是怎么遍历的问题啦,而标记是为了解决陷入询问死循环的问题(比如一个客人B说A需要我就需要,而A也说B需要我就需要,所以有必要标记一下这个人有没有问过,问过了就不问了!)。
那么增量GC又是什么东西呢?它有啥特殊的本领?
首先增量GC是一种GC(废话),它的存在是为了解决标记清除的长停顿问题(就是由于垃圾太多,虚拟机大哥清理了好久都没干完,不能腾出空来干正事)。
它有一个原则:
- 垃圾永远是垃圾,不管GC跑了几遍都是垃圾
还有一个策略:
新生的对象不是垃圾
当虚拟机访问一个对象的时候,该对象及其相关的对象不是垃圾。
那具体是怎么操作的呢?
增量GC名称的由来跟全量GC相对,就是每次只处理一小部分的对象。具体还是分为标记阶段和清除阶段来阐述。