算法
引用计数法 Reference Counting
优点:实现简单
缺点:循环引用无法解决 伴随性能问题(计数器的加减法操作)
标记清除法 Mark-Sweep
阶段一 标记阶段
从 GCROOT 节点遍历引用,标记从 GCROOT 节点可达的对象
阶段二 清除阶段
清除阶段一未标记的对象
优点 没有循环引用问题
缺点 产生空间碎片
复制算法 Copying
优点 不产生空间碎片
缺点 浪费一半的空间
jvm 新生代垃圾回收采用这种思想
标记压缩法 Mark-Compact
阶段一 标记阶段
阶段二 移动存活对象到内存的一端
阶段三 清除边界外的内存
分代算法 Generational Collecting
根据不同的代采取不同的算法
分区算法 Region
垃圾收集器
新生代串行回收器
使用复制算法
1. 仅仅使用单线程进行垃圾回收
2. 独占式的垃圾回收
老年代串行回收器
使用标记压缩算法
串行,独占式垃圾回收器
-XX:+UseSerialGC 指定使用新生代和老年代串行收集器
-XX:+UserParNewGC 新生代使用 ParNew回收器,老年代使用串行收集器
-XX:+UseParallelGC 新生代使用 ParallelGC回收器,老年代使用串行收集器
新生代 ParNew 回收器
将串行回收器多线程化 独占式回收器
-XX:+UserParNewGC 新生代使用 ParNew回收器,老年代使用串行收集器
-XX:+UserConcMarkSweepGC 新生代使用 ParNew回收器,老年代使用CMS
-XX:ParallelGCThreads 参数指定 ParNew 回收器的工作时的线程数量
当 CPU 数小于8个时 ParallelGCThreads 等于 cpu 数 当 CPU 数量大于8时ParallelGCThreads 3+((5*CPU_Count)/8)
新生代 ParallelGC回收器
使用复制算法 多线程独占式回收器
非常关注系统的吞吐量
-XX:+UseParallelGC 新生代使用 ParallelGC回收器,老年代使用串行收集器
-XX:+UseParallelOldGC 新生代使用 ParallelGC回收器,老年代使用UseParallelOldGC收集器
-XX:MaxGCPauseMills 设置最大垃圾收集停顿时间
-XX:GCTimeRatio 设置吞吐量大小
-XX:+UseAdaptiveSizePolicy 打开自适应 GC 策略
老年代 ParallelOldG回收器
使用标记压缩算法 与ParallelGC 配合使用 关注吞吐量
CMS 回收器
并发标记清除 主要关注系统停顿时间
-XX:+UseConcMarkSweepGC 启用 cms
-XX:ParallelGCThreads 参数指定 回收器的工作时的线程数量
默认并发线程数 (ParallelGCThreads+3)/4
-XX:-CMSPrecleaningEnabled 关闭预处理
- XX: ConcGCThreads
- XX: ParallelCMSThreads
- XX: CMSInitiatingOccupancyFraction 回收阀值 当内存使用率达到阀值进行回收
-XX:+ UseCMSCompactAtFullCollection fullGC 后进行一次碎片整理
- XX: CMSFullGCsBeforeCompaction 进行多少起 fullGC 后进行一次碎片整理
- XX:+CMSClassUnloadingEnabled 开启回收 Perm