- 常见的垃圾回收算法有哪些?分别是怎么进行回收的?各种垃圾回收算法适用于哪些场景?
标记清除算法
先暂停整个程序的全部运行线程,让回收线程以单线程进行扫描标记,并进行直接清除回收,然后回收完成后,恢复运行线程。标记清除后会产生大量不连续的内存碎片,造成空间浪费。
标记整理算法
和 标记清除 相似,不同的是,回收期间同时会将保留的存储对象搬运汇集到连续的内存空间,从而集成空闲空间。
复制回收算法
将可用内存分为大小相等的两份,在同一时刻只使用其中的一份。当这一份内存使用完了,就将还存活的对象复制到另一份上,然后将这一份上的内存清空。复制算法能有效避免内存碎片,但是算法需要将内存一分为二,导致内存使用率大大降低。
优点:简单,高效。
分代回收
在 JVM 中不同的对象拥有不同的生命周期,因此对于不同生命周期的对象也可以采用不同的垃圾回收算法,以提高效率,这就是分代回收算法的核心思想。
各种垃圾回收算法的适用场景
我们了解了三种垃圾回收算法后会发现,没有一个算法是完美,每种算法都有自己的特点,都有自己适用的场景。
标记清除法适用场景
1、只有小部分对象需要进行回收的,因为回收对象太多,其清除的时间就会越长。
2、关注停顿时间,对用户线程停顿时间有要求。
标记复制法适用场景
1、大部分对象都是需要进行回收只有少量对象存活的,因为需要把存活对象复制到新的内存区域,所需要复制的对象越多那么其复制的时间就会越长。
标记整理法适用场景
1、只有小部分对象需要进行回收的,因为标记整理法也需要清除掉回收对象,回收对象多其清除的时间就会越长。
2、关注吞吐量。
我们根据我们JVM内存结构分区会发现,标记清除法、标记整理法是适用于老年代的垃圾回收,因为老年代的对象一般都是存活的比较多, 而标记复制法则适用于我们的新生代的垃圾回收,因为新生代大多数的对象都是朝生夕死的。