0 概述
基础垃圾算法:标记-清除、标记-整理、复制
综合垃圾回收算法:分代收集算法、增量算法
1 标记-清除(Mark-Sweep)
标记需要回收的对象
清理掉要回收的对象
缺点:垃圾回收之后会存在内存碎片
2 标记-整理(Mark-Compact)
标记需要回收的对象
把所有的存活对象压缩的内存的一端
清理掉边界外的所有空间
这个算法可以避免标记-清除算法会产生的内存碎片
3 复制(Copy)
把内存分为两块,每次只使用一块
把当前使用的内存中的存活对象复制到未使用的内存中去,然后清除掉正在使用的内存中的所有对象
交换两个内存的角色,等待下次回收
4 三种算法对比
回收算法 | 有点 | 缺点 |
---|---|---|
标记-清除 | 实现简单 | 存在内存碎片、分配内存速度会受影响 |
标记-整理 | 无碎片 | 整理内存存在开销 |
复制 | 性能好、无碎片 | 内存利用率低 |
5 分代收集算法
各种商业虚拟机堆内存的垃圾回收基本上都采用了垃圾回收
根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象
5.1 回收类型
- 新生代回收(Minor GC|Young GC)
- 老年代回收(Major GC)
- 清理整个堆的回收(Full GC)
一般的,发生 Major GC 时同时一般也会发生 Minor GC,所以 Major GC 约等于 Full GC。
对象分配过程见JVM之对象的创建过程
分代收集算法调优原则:
- 合理设置 survivor 区域的大小,避免内存浪费;
- GC尽量发生在新生代,尽量减少 Full GC 的发生。
相关的JVM参数
6 增量算法
如果内存非常大,如果一次性回收所有垃圾,势必会消耗很多的时间,从而造成系统长时间停摆。
- 每次只收集一小片区域的内存空间的垃圾