Java常用垃圾收集器

垃圾收集器

Serial

  • 单线程,使用复制算法
  • 用于新生代的垃圾回收
  • 进行GC时必须暂停所有其他工作线程
  • 适用于内存不太大的桌面应用

Serial Old

  • Serial的老年代版本
  • 单线程,使用标记-整理算法

ParNew

  • Serial的多线程版本,可与CMS配合使用
  • 用于新生代的垃圾回收
  • CPU数量多的时候才能发挥优势,适用于Server上的应用

Parallel Scavenge

  • 目标上达到一个可控的吞吐量,降低GC时间的占比
  • 不能和CMS配合使用
  • 适用于后台运算而不需要太多交互的任务
  • 可使用-XX:+UseAdaptiveSizePolicy开启自适应调节策略,由虚拟机来调节各个相关参数的值

Parallel Old

  • Parallel Scavenge的老年代版本
  • 多线程,使用标记-整理算法
  • 适用于在吞吐量优先的场合和Parallel Scavenge配合使用

CMS

  • 全称:Concurrent Mark Sweep
  • 以获取最短回收停顿时间为目标
  • 适用于重视响应速度,用户交互比较多的应用
  • 用于老年代的GC,使用标记-清除算法
  • GC分为4个步骤:初始标记,并发标记,重新标记,并发清除
  • 初始标记和重新标记需要Stop The World,并发标记和并发清除可以和用户线程并发执行
  • 并发标记和并发清除占用了cpu资源,会导致用户线程的执行速度变慢
  • 在进行GC时用户线程会产生新的垃圾(浮动垃圾),这些垃圾只能在下一次GC时清理,所以不能等到老年代快满了才进行GC,参数-XX:CMSInitiatingOccupancyFraction用于设置触发GC的百分比,在jdk 1.6中,这个值时92%
  • 标记-清除算法会产生大量内存碎片,但无法找到足够大的连续空间分配给对象时会提前出发一次Full GC

G1

  • 适用于服务端应用

猜你喜欢

转载自blog.csdn.net/u012124304/article/details/81608377