垃圾收集算法
1.标记 - 清除算法(Mark-Sweep)
注意:在这个算法中的不足
1.效率问题,标记和清除两个过程的效率都不高,
2.另一个是空间问题,标记清除后会产生大量的不连续的内存碎片,空间内存碎片太多可能导致一户在程序运行过程中需要分配较大的对象时,无法找到足够的连续的内存而不得不提前出发另一次垃圾收集动作
复制算法:
注意:
复制算法是将可用内存按容量的大小划分为大小相等的两块,每次使用其中一块,当这块的内存用完了将存活的对象复制到另外以快上去,再把使用过的内存空间清理一遍,只要推动堆的指针,按顺序分配内存即可,实现简单,运行高效,但这种算法的代价是内存缩小到原来的一半。
标记 - 整理算法:
注意:
这种算法和标记 - 清除算法一样只不过在清理之前将存活对象进行整理,避免程序中分配过大对象时,触发下一次垃圾回收。
分代收集算法:
HotSpot的算法实现:
1.枚举根节点
HotSpot 垃圾收集器
serial收集器:
单线程,基于复制算法的,在新生代
parnew收集器
多线程的serial
-XX:ParallelGCThreads:设定垃圾收集的线程数
parallel scavenge收集器(并发收集器)
多线程的基于复制算法工作在新生代的收集器,吞吐量可控制 停顿时间:-XX:MaxGCPauseMillis 吞吐量大小:-XX:GCTimeRatio
吞吐量=运行代码的时间 /(运行用户代码时间+垃圾收集时间)
serial old收集器
单线程,基于复制算法的,在老生代
parallel old收集器
多线程的serial old收集器
CMS收集器(Concurrent Mark Sweep吞吐量可控)
步骤:
1.初始标记 GC Root能直接关联的对象速度快
2.并发标记 GC Roots Tracing 的过程(修正并发标记期间因用程序继续运行导致标记产生变动的那部分标记记录)
3.重新标记
4.并发清理
stop the word Time:
并发标记 > 初始标记
注意:并发标记和并发清除过程收集器县城可以和用户线程一起工作
CMS优点:并发收集,低停顿
缺点:1.对CUP资源敏感,当用户线程和CMS一起工作时,吞吐量降低,CMS默认启动回收线程数(cup数量+3)/4 ---> 增量式并发收集器(Incremental Concurrent Mark Sweep) GC线程和用户线程交替运行
2.无法处理浮动垃圾
3.也是Mark Sweep的缺点
G1收集器(低停顿)
G1收集器步骤:
初始标记
并发标记
最终标记
筛选回收
栈中有多个Remenbered Set 用来存储Region, Region是跟踪对象,判断对象是否存活,依赖于对象,不能独立存在,Remembered避免全堆扫描。Region可以提高gc效率,回收价值较大的垃圾。