jvm——分代垃圾回收机制

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

前言

垃圾回收算法主要有种:
1、标记清除算法
2、标记整理算法
3、标记复制算法

一般不会采用其中一种进行垃圾回收,而是采用分代回收机制,下面就来了解分代回收机制。

概念

现在大多商业jvm的垃圾收集器都遵循了分代收集的理论进行设计。
它把堆内存中的区域划分成两大块,一个叫新生代(Young Generation),一个叫老年代(Young Generation)两个区域,在新生代中每次垃圾收集时都发现有大量对象死去,然后每次回收后存活的少量对象逐步晋升到老年代中存放。
用完就能丢弃的对象就放在新生代中,长时间使用的对象就放在老年代中。这样就可以根据生命周期的不同特点使用不同的垃圾回收策略,老年代的垃圾回收很久才一次,新生代就会经常进行垃圾回收。
每个区域又分为个部分:Eden(伊甸园)、幸存区 From幸存区 To

image.png

minor GC 工作原理

第一次垃圾回收

当我们创建一个对象的时候它最开始会创建在 Eden 中。

image.png

之后会有越来越多的对象被创建在Eden 里,直至Eden内存被占用满这个时候就会出现一次垃圾回收,新生代的垃圾回收叫做 minor GC

image.png

minor GC流程就是先标记垃圾然后把垃圾清除,然后把存活的对象复制到幸存区To中并且会把幸存的对象寿命加1,并且会交换幸存区 From幸存区To,这就是第一次垃圾回收。

image.png

第二次垃圾回收

第一次垃圾回收完之后Eden区域又有剩余的内存可以使用了,这个时候我们又创建了很多新对象,并再一次把该区域占满。
触发垃圾回收,前部分都是一样,先标记清除,再复制到幸存区 To中,由于进行过交换这个时候的幸存区To就不是第一次垃圾回收的幸存区To了,而是第一次垃圾回收前的幸存区From

image.png

再标记幸存区To中对象是否为垃圾,是垃圾就清除掉,不为垃圾就放入幸存区From中,并把对象寿命加1,再次交换幸存区 From幸存区To
幸存区结论:谁空谁就是幸存区To

第n次垃圾回收

假设一个对象的寿命超过了一个域值了,就证明这个对象是比较有价值的,那么就会晋升到老年代中,新生代继续进行minor GC策略。

猜你喜欢

转载自juejin.im/post/7031549740248465439