JVM学习-垃圾收集器

Posted 智公博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习-垃圾收集器相关的知识,希望对你有一定的参考价值。

虚拟机有许多的垃圾收集器可以选择,这里简单的记录分享下每个收集器的特点

一、Serial
  1. 历史最久,曾经是新生代唯一选择
  2. 单线程,进行时暂停所有用户线程-Stop The World
  3. Client模式下默认新生代收集器
  4. 单个线程更加高效简单,没有线程交互开销,一般client应用内存使用不大,停顿时间很短

二、ParNew

  1. Serial的多线程版本,控制参数、收集算法、Stop The World、对象分配策略、回收策略相同
  2. 新生代收集器
  3. 除了Serial已外,只有ParNew可以与CMS配合使用
  4. 单CPU环境下,性能差于Serial
  5. 默认下GC线程数与CPU数相同,可配置(-XX: ParallelGCThreads)

三、Parallel Scavenge

  1. 新生代收集器,采用复制算法
  2. 并行多线程收集
  3. 目标不是缩短停顿时间,而是达到可控制的吞吐量:CPU运行用户线程时间与CPU总消耗时间比
  4. 为了更高效率利用CPU时间
  5. 两个参数控制吞吐量:最大停顿时间:-XX:MaxGCPauseMillis(>0),直接吞吐量大小:-XX:GCTimeRatio(0~100)
  6. 尽可能保证停顿时间不超过设置值,
  7. 短停顿时间以牺牲吞吐量和新生代空闲换取,GC更频繁,吞吐量下降
  8. GCTimeRatio 吞吐量倒数,默认值99,即最大1% GC时间
  9. 吞吐量优先
  10. 自动化开关参数:-XX:+UseAdaptiveSizePolicy,不需手动设置新生代大小(-Xmn)、Eden与Survivor区比例(-XX:SurvivorRatio)、晋升老年代年龄(-XX:PretenureSizeThreadhold),虚拟机GC自适应调节策略:动态调整这些参数提供最适合的停顿时间或最大吞吐量
  11. 同是多线程并行,自适应调节是与ParNew最大的区别

四、Serial Old

  1. Serial的老年代版本
  2. 单线程
  3. 标记-整理 算法
  4. 主要用于Client模式

五、Parallel Old

  1. Parallel Scavenge 老年代版本
  2. 并行多线程
  3. 标记-整理 算法
  4. 在此收集器发布前,Parallel Scavenge 只能与Serial Old配置使用,二Serial Old在服务端应用性能较差
  5. 与Parallel Scavenge 配合,吞吐量优先

六、CMS

  1. Concurrent Mark Sweep,并发低停顿
  2. 以最短停顿时间为目标
  3. 标记-清除 算法
  4. 收集四个阶段:初始标记、并发标记、重新标记、并发清除
  5. 初始标记:Stop The World,快速标记GC Roots直接关联对象
  6. 并发标记:并发可达性分析
  7. 重新标记,Stop The World,修正并发阶段对象引用变动导致的变更
  8. 最耗时的并发标记、并发清除可以与用户线程一起工作
  9. 对CPU资源敏感,多线程并发程序通常都是这样,当CPU数少,或CPU资源紧张,性能下降
  10. 无法处理浮动垃圾,可能出现Concurrent Mode Failure 导致另一次Full GC;
  11. 浮动垃圾(Floating Garbage):并发清理阶段用户线程还在运行,这个阶段新产生的垃圾不会在该次GC回收,因为已经过了标记阶段;
  12. 不可在老年代几乎用完才启动GC,必须保留较大一部分空间,用于GC中程序继续运行所需,默认68%
  13. 通过-XX:CMSInitiatingOccupancyFraction控制这个百分比,设置过高会导致“Concurrent Mode Failure”,过低又导致频繁GC
  14. CMS GC期间,出现内存不出会出现“Concurrent Mode Failure”失败,虚拟机将会启动后背方案,保证内存分配:临时启动Serial Old 重新一次老年代GC,导致长停顿
  15. 标记-清除 算法导致内存碎片,大对象分配难,导致频繁GC,运行控制Full GC 时开启合并整理,但是会导致停顿时间加长

七、G1(Garbage-First)

  1. JDK1.7 最新,面向服务端应用
  2. 并发、并行:充分利用多CPU
  3. 分代收集,可管理整个堆,包括新生代和老年代
  4. 标记-整理 、复制 算法,GC不产生碎片
  5. 低停顿,可预测停顿时间模式
  6. 内存分区域管理(保留新生代和老年代概念)
  7. 分区域进行GC,避免全区域GC,高回收价值区域(单位时间内回收更多的内存空间)优先回收,可控制停顿时间

以上是关于JVM学习-垃圾收集器的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾收集—垃圾收集器及常见组合参数

JVM中的垃圾回收器及垃圾收集算法描述

阿里面试100%问到,JVM性能调优篇

JVM笔记-HotSpot的算法细节实现

JVM之GI收集器

JVM(HotSpot)7种垃圾收集器