暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JVM 调优实例

追梦Java 2023-08-08
39
点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

JVM提供了多种垃圾回收器,可以根据应用程序的需求选择最适合的垃圾回收器。例如,如果应用程序需要更快的响应时间,可以选择并行垃圾回收器(Parallel GC)或并发垃圾回收器(Concurrent Mark Sweep GC)。如果应用程序需要更低的停顿时间,可以选择增量垃圾回收器(Incremental GC)或并发的垃圾回收器(Concurrent GC)。


1

设置不同的垃圾收集器,分析 GC 日志


首先写一段测试代码:TestHeap.java,如下:

    package jvm;


    import java.util.ArrayList;
    import java.util.List;


    //测试代码
    public class TestHeap {


    public static void main(String[] args) {
    List<Heap> list = new ArrayList<Heap>();
    while (true) {
    list.add(new Heap());
    }
    }
    }


    class Heap {
    String HeapName = "Java Heap 测试";
    }

    1、JDK8 默认的垃圾收集器是:UseParallelGC,吞吐量优先


    在运行 TestHeap.java 之前,设置如下参数:

      -XX:+PrintGCDetails 
      -XX:+PrintGCDateStamps
      -XX:+PrintGCTimeStamps
      -Xloggc:d:/dump/gc1.log

      分析 GC 日志,gc1.log:

      2、老年代设置为 CMS 收集器,停顿时间优先


      在运行 TestHeap.java 之前,设置如下参数:

        -XX:+UseConcMarkSweepGC 
        -XX:+PrintGCDetails
        -XX:+PrintGCDateStamps
        -XX:+PrintGCTimeStamps
        -Xloggc:d:/dump/cms-gc.log

        分析 GC 日志,cms-gc.log:

        3、G1 收集器,停顿时间优先


        在运行 TestHeap.java 之前,设置如下参数:

          -XX:+UseG1GC -XX:+PrintGCDetails 
          -XX:+PrintGCDateStamps
          -XX:+PrintGCTimeStamps
          -Xloggc:d:/dump/G1-gc.log

          分析 GC 日志,G1-gc.log:

          了解 G1 GC 日志:https://blogs.oracle.com/poonam/understanding-g1-gc-logs


          2

          使用 G1 回收器,从几个维度进行 JVM 调优


          设置不同的 JVM 参数,分析输出的 GC 日志,从以下 3 个方面来判断 JVM 是否达到最佳效果:

          1、吞吐量

          2、停顿时间

          3、GC 执行次数

          下面介绍调优的思路。


          1、首先使用默认的 JVM 参数,使用 GCViewer 分析 GC 日志,记录 GC 效果,以此为基准进行调优


          GC 效果分析表:

          2、调整内存大小,观察效果


          通过设置不同的内存大小来观察吞吐量、停顿时间,GC 次数的变化,记录 GC 效果。

          分析上表,容易看出好的方面是:吞吐量提高了,GC 次数减少了;坏的方面是:停顿时间增加了。


          3、调整最大停顿时间,观察效果


          G1 可以设置停顿时间,通过设置不同的停顿时间来观察吞吐量、停顿时间,GC 次数的变化,记录 GC 效果:

          分析上表,容易看出停顿时间确实少了,但是吞吐量下降了,GC 次数反而又增加了,效果不如之前,此时需要把停顿时间再放大一点,再次尝试。但是暂停时间设置的太短,就会导致出现 G1 回收跟不上垃圾产生的速度,最终退化成 Full GC,从而影响性能。

          4、调整开始并发 GC 周期的堆占用百分比(0到100)

          默认情况下,初始堆的占用率设置为 45%,也就是说当堆的占用率达到 45%,就会触发 GC,值为 0 表示不间断的进行 GC 循环,以下命令将初始堆占用率设置为75%:

          -XX:InitiatingHeapOccupancyPercent = 75

          调优的过程就是不断的尝试设置 JVM 的参数,使吞吐量、停顿时间,GC 次数达到一个理想的情况。


          oracle 官网对 G1 收集器优化建议:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#recommendations

          大家可以自己研究一下。


          后面将为大家介绍 JVM 性能优化思路。

          文章转载自追梦Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论