版权声明:不短不长八字刚好@wzy https://blog.csdn.net/qq_38089964/article/details/85867874
算法:
- 标记-清除:产生大量离散碎片
- 复制算法:三个区域eden(大)+2*survivor(小);每次在eden新建对象,gc的时候复制到另外一个survivor中,清除以前的两个区域。
- 标记-整理:压缩可用区域,将可用对象挤在一起
垃圾收集器:
- Serial 收集器(新生代):单线程阻塞所有用户进程,采用复制算法清理新生代
- Serial Old 收集器(老年代):Serial的老年代收集版本,采用标记整理算法
- ParNew 收集器(新生代):Serial的多线程版本,采用多线程复制算法
- Parallel Scavenge 收集器(新生代):和ParNew类似,更专注于提高吞吐量(=运行代码时间/运行代码时间+GC时间),自适应调节各个区域的比例、晋升老年代对象大小,达到一个更高的吞吐量
- Parallel Old收集器(老年代):于Parallel Scavenge配合,多线程标记整理算法回收老年代
- CMS收集器(Concurrent Mark Sweep)(老年代):多线程标记清除算法。
步骤:- 初始标记:标记GC ROOT直接关联对象
- 并发标记:从GC ROOT一路往下标记
- 重新标记:标记用户程序变化的那一部分
- 并发清理:清理无效对象
- G1 收集器(整个堆):将堆内存划分成很多的大小相等的独立区域,然后标记之后对每个区域的回收价值大小排序,优先从价值大的区域开始回收。
将需要回收的区域存活对象复制到其他不需要回收的区域中。
步骤:(每个区域有一个数据结构保存该区域的标记对象集合)- 初始标记:标记GC ROOT直接关联对象
- 并发标记:从GC ROOT一路往下标记
- 最终标记:将二次标记的结果加进本区域的标记集合中
- 筛选回收:筛选价值最大的区域开始回收