深入JVM内核原理-7.GC参数

1.堆的回顾

堆.png

2.串行收集器

  • 最古老,最稳定
  • 效率高
  • 可能会产生较长的停顿
  • -XX:+UseSerialGC
    • 新生代、老年代使用串行回收
    • 新生代复制算法
    • 老年代标记-压缩
串行收集器.png

3.并行收集器

  • ParNew

    • -XX:+UseParNewGC
      • 新生代并行
      • 老年代串行
    • Serial收集器新生代的并行版本
    • 复制算法
    • 多线程,需要多核支持
    • -XX:ParallelGCThreads限制线程数量
    并行收集器1.png
  • Parallel收集器

    • 类似ParNew
    • 新生代复制算法
    • 老年代标记-压缩
    • 更加关注吞吐量
    • -XX:+UseParallelGC
      • 使用Parallel收集器+老年代串行
    • -XX:+UseParallelOldGC
      • 使用Parallel收集器+老年代并行
    并行收集器2.png
    • -XX:MaxGCPauseMills
      • 最大停顿时间,单位毫秒
      • GC尽力保证回收时间不超过设定值
    • -XX:GCTimeRatio
      • 0-100的取值范围
      • 垃圾收集时间占总时间的比
      • 默认99,即最大允许1%时间做GC
    • 这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优

4.CMS收集器

  • CMS收集器

    • Concurrent Mark Sweep并发标记清除
    • 标记-清除算法
    • 与标记-压缩相比
    • 并发阶段会降低吞吐量
    • 老年代收集器(新生代使用ParNew)
    • -XX:+UseConcMarkSweepGC
  • CMS运行过程比较复杂,着重实现了标记的过程,可分为

    • 初始标记
      • 根可以直接关联到的对象
      • 速度快
    • 并发标记(和用户线程一起)
      • 主要标记过程,标记全部对象
    • 重新标记
      • 由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
    • 并发清除
      • 基于标记结束,直接清理对象
    CMS收集器.png
  • 特点

    • 尽可能降低停顿
    • 会影响系统整体吞吐量和性能
      • 比如,在用户线程运行过程中,分一半CPU去做GC,系统性能在GC阶段,反应速度就下降一半
    • 清理不彻底
      • 因为在清理阶段,用户线程还在运行,会产生新的垃圾,无法清理
    • 因为和用户线程一起运行,不能在空间快满时再清理
      • -XX:CMSInitiatingOccupancyFraction设置触发GC的阈值
      • 如果不幸内存预留空间不够,就会引起concurrent mode failure
    清除与压缩比较.png
  • -XX:UseCMSCompactAtFullCollection Full GC后,进行一次整理

    • 整理过程是独占的,会引起停顿时间变长
  • -XX:+CMSFullGCsBeforeCompaction

    • 设置进行几次Full GC后,进行一次碎片整理
  • -XX:ParallelCMSThreads

    • 设定CMS的线程数量

5.GC参数整理

GC参数整理1.png

GC参数整理2.png

6.Tomcat实例

  • 环境
    • Tomcat 7
    • JSP网站
    • 测试网站吞吐量和延时
  • 工具
    • JMeter
  • 目的
    • 让Tomcat有一个不错的吞吐量
Tomcat实例1.png

Tomcat实例2.png

Tomcat实例3.png

Tomcat实例4.png

Tomcat实例5.png

Tomcat实例6.png

Tomcat实例7.png

Tomcat实例8.png

Tomcat实例9.png

Tomcat实例10.png

Tomcat实例11.png

你可能感兴趣的:(深入JVM内核原理-7.GC参数)