JVM性能优化 - JVM参数及调优

作者: 右耳菌 | 来源:发表于2022-06-07 18:10 被阅读0次

    一、调优的基本概念

    在调整性能时,JVM有三个组件:

    • 堆大小调整
    • 垃圾收集器调整
    • JIT编译器

    大多数调优选项都与调整堆大小和为您的情况选择最合适的垃圾收集器有关。
    JIT编译器对性能也有很大影响,但很少需要使用较新版本的JVM进行调优。

    堆大小调整:基本上来说,对于堆大小,如果可以的话,堆内存调高一点即可,没有什么其他的说法。

    调优的时候重点是以下两个目标之一:

    • 响应性:应用程序或者系统对请求的数据的响应速度应该是要保证的,对于一些很专注于响应性的程序,长时间的暂停时间是无法被接受的,要求响应的时间尽量短。
    • 吞吐量:则侧重于在特定时间段内最大化应用程序的工作量,对于专注吞吐量的应用程序,高暂停时间是可以接受的。由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑快速响应时间。

    二、常用的JVM参数

    • 常用的JVM参数
    参数 说明
    -XX:+AlwaysPreTouch jvm启动时分配内存,非使用时再分配
    -XX: ErrorFile = filename 崩溃日志
    -XX:+TraceClassLoading 跟踪类加载信息
    -XX:+PrintClassHistogram 按下Ctrl+Break后,打印类的信息
    -Xmx-Xms 最大堆和最小堆
    -xx:permSize、-xx:metaspaceSize 永久代/元数据空间
    -XX:+HeapDumponOutOfMemoryError OOM时导出堆到文件
    -XX:+HeapDumpPath OOM时堆导出的路径
    -XX:OnOutOfMemoryError 在OOM时,执行一个脚本
    java -XX:+PrintFlagsFinal -version 打印所有的-XX参数和默认值

    三、GC调优思路

    1. 分析场景
      例如:启动速度慢;偶尔出现响应慢于平均水平或者出现卡顿
    2. 确定目标
      内存占用、低延时、吞吐量
    3. 收集日志
      通过参数配置收集GC日志;通过JDK工具查看GC状态
    4. 分析日志
      使用工具辅助分析日志,查看GC次数,GC时间
    5. 调整参数
      切换垃圾收集器或者调整垃圾收集器参数

    四、通用的GC参数

    参数 说明
    -XX:ParallelGCThreads 并行GC线程数量
    -XX:ConcGCThreads 并发GC线程数量
    -XX:MaxGCPauseMillis 最大停顿时间,单位毫秒
    GC尽力保证回收时间不超过设定值
    -XX:GCTimeRatio 0-100的取值范围
    垃圾收集时间占总时间的比
    默认99,即最大允许1%时间做GC
    -XX:SurvivorRatio 设置Eden区大小和Survivor区大小的比例
    8表示两个Survivor:Eden=2:8,即一个Survivor占年轻代的1/10
    -XX:NewRatio 新生代和老年代的比
    4表示新生代:老年代=1:4,即年轻代占堆的1/5
    -verbose:gc、-XX:+printGC 打印GC的简要信息
    -XX:+PrintGCDetails 打印GC详细信息(JDK9会被舍弃)
    -XX:+PrintGCTimeStamps 打印CG发生的时间戳(JDK9会被舍弃)
    -Xloggc:log/gc.log 指定GC log的位置,以文件输出
    -XX:+PrintHeapAtGC 每次一次GC后,都打印堆信息
    • 图片版本
    • 通用的GC参数

    五、垃圾收集器CMS参数调优

    1. 响应时间优先
    2. Parallel GC无法满足应用程序延迟要求时再考虑使用CMS垃圾收集器。
    3. 新版建议用Gl垃圾收集器
    • 图片版本
    • 垃圾收集器CMS参数调优

    六、垃圾收集器G1参数调优

    1. 兼顾吞吐量和响应时间
    2. 超过50%的Java堆被实时数据占用。
    3. 建议大堆(大小约为6GB或更大)
    4. 且GC延迟要求有限的应用(稳定且可预测的暂停时间低于0.5秒)。
    • 图片版本


      垃圾收集器G1参数调优

    七、 运行时JIT编译器优化参数

    JIT编译指的是字节码编译为本地代码(汇编)执行,只有热点代码才会编译为本地代码。解释器执行节约内存,反之可以使用编译执行来提升效率

    • 图片版本
    • 运行时JIT编译器优化参数

    很少需要对较新版本的JVM进行JIT调优


    八、JVM调优笔记 - 例子

    • 测试环境:JVM配置为2核1G,JAVA8,固定设置堆大小 1G
    java version "1.8.0_192"
    Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
    # 默认大小通常太小,尽量授予尽可能多的内存,增加CPU的时候,内存也应该增加
    java -Xmx1024m  -jar performance-1.0.0.jar
    
    • 1、 示例代码 -1
    // 启动程序,模拟用户请求
    // 每100毫秒钟创建150线程,每个线程创建一个512kb的对象,最多一秒同时存在1500线程,占用内存750m(75%),查看GC的情况
    @SpringBootApplication
    public class PerformanceApplication {
        public static void main(String[] args) {
            SpringApplication.run(PerformanceApplication.class, args);
            Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
                new Thread(() -> {
                    for (int i = 0; i < 150; i++) {
                        try {
                            //  不干活,专门512kb的小对象
                            byte[] temp = new byte[1024 * 512];
                            Thread.sleep(new Random().nextInt(1000)); // 随机睡眠1秒以内
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }, 100, 100, TimeUnit.MILLISECONDS);
        }
    }
    // 打包 mvn clean package
    // 服务器上运行 performance-1.0.0.jar
    // 对象存活在1秒左右的场景,远远超过平时接口的响应时间要求,场景应该为吞吐量优先
    
    • 1.1 GC分析,主要查看GC导致的stop-the-world,这将导致我们的程序延时增大。
    # 查找到performance-1.0.0.jar的进程号
    jcmd | grep "performance-1.0.0.jar" | awk '{print $1}'
    # jmap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况
    jmap -heap $(jcmd | grep "performance-1.0.0.jar" | awk '{print $1}')
    # 收集GC日志(日志离线分析,主要用于检查故障看出是不是因为GC导致的程序卡顿)
    # 不建议直接输出 java -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar performance-1.0.0.jar
    java -Xmx1024m -Xloggc:/xxxxx/gc1.log -jar performance-1.0.0.jar
    # 分析GC日志()
    GCViewer工具,辅助分析GC日志文件 https://github.com/chewiebug/GCViewer
    # jstat 动态监控GC统计信息,间隔1000毫秒统计一次,每10行数据后输出列标题
    jstat -gc -h10 $(jcmd | grep "performance-1.0.0.jar" | awk '{print $1}') 1000
    
    • 1.2 GC调优
    # 通过命令查看参数:java -XX:+PrintFlagsFinal –version | grep 参数关键字
    # Parallel GC  服务器默认  java -Xmx1024m -Xloggc:/xxxxx/gc1.log -jar performance-1.0.0.jar
    UseAdaptiveSizePolicy自适应默认开启,所以Eden区会自动变化大小
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    29184.0 29184.0  0.0    0.0   290816.0 275028.2  214528.0   90453.2   35068.0 33496.5 4656.0 4334.9     15    0.285   7      0.549    0.834
    29184.0 37888.0 28704.9  0.0   273408.0 195849.2  214528.0   136022.6  35068.0 33497.2 4656.0 4334.9     16    0.306   7      0.549    0.856
    37888.0 37888.0  0.0    0.0   273408.0 141381.4  230912.0   89954.2   35068.0 33497.7 4656.0 4334.9     17    0.341   8      0.624    0.966
    37888.0 49152.0 37409.1  0.0   250880.0 98232.2   230912.0   127331.4  35068.0 33498.4 4656.0 4334.9     18    0.363   8      0.624    0.987
    49152.0 49152.0  0.0   48673.5 250880.0 82729.6   230912.0   152932.2  35068.0 33498.8 4656.0 4334.9     19    0.385   8      0.624    1.009
    49152.0 63488.0  0.0    0.0   222208.0 70943.1   234496.0   90654.2   35068.0 33505.3 4656.0 4334.9     20    0.409   9      0.697    1.106
    63488.0 63488.0  0.0   63009.9 222208.0 104636.8  234496.0   100894.5  35068.0 33508.4 4656.0 4334.9     21    0.431   9      0.697    1.128
    63488.0 81920.0 63009.9  0.0   185344.0 139024.0  234496.0   111646.8  35068.0 33512.1 4656.0 4334.9     22    0.452   9      0.697    1.149
    91648.0 100864.0 74786.3  0.0   147456.0 33980.1   234496.0   111646.8  35068.0 33528.3 4656.0 4334.9     24    0.495   9      0.697   1.192
    107520.0 112640.0 74274.3  0.0   123904.0 30746.2   234496.0   111646.8  35068.0 33528.3 4656.0 4334.9     26    0.539   9      0.697  1.236
    默认情况,实时监控结果:10秒内11次YGC,2次FullGC,总耗时0.4秒
    
    1、 调大-XX:ParallelGCThreads=4  java -Xmx1024m -Xloggc:/xxxxx/gc2.log -XX:ParallelGCThreads=4  -jar performance-1.0.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    10752.0 9216.0  0.0    0.0   264192.0 195460.3  105472.0   58165.2   35120.0 33480.3 4656.0 4333.8     13    0.153   3      0.219    0.373
    10752.0 12288.0  0.0    0.0   324608.0 59139.9   135168.0   69954.5   35120.0 33483.8 4656.0 4334.9     14    0.180   4      0.277    0.458
    10752.0 12288.0  0.0    0.0   324608.0 190623.5  135168.0   69954.5   35120.0 33483.8 4656.0 4334.9     14    0.180   4      0.277    0.458
    10752.0 12288.0  0.0    0.0   324608.0 317022.0  135168.0   69954.5   35120.0 33483.8 4656.0 4334.9     14    0.180   4      0.277    0.458
    12288.0 12288.0  0.0    0.0   324608.0 156095.2  166912.0   82766.1   35120.0 33486.7 4656.0 4334.9     15    0.199   5      0.325    0.524
    12288.0 12288.0  0.0    0.0   324608.0 311437.3  166912.0   82766.1   35120.0 33486.7 4656.0 4334.9     15    0.199   5      0.325    0.524
    12288.0 15360.0  0.0    0.0   318464.0 175117.9  195072.0   90455.3   35120.0 33487.1 4656.0 4334.9     16    0.217   6      0.380    0.598
    15360.0 15360.0  0.0    0.0   318464.0 37004.8   212480.0   90463.3   35120.0 33487.1 4656.0 4334.9     17    0.231   7      0.430    0.661
    15360.0 15360.0  0.0    0.0   318464.0 225927.9  212480.0   90463.3   35120.0 33487.1 4656.0 4334.9     17    0.231   7      0.430    0.661
    15360.0 19456.0  0.0    0.0   310272.0 103539.3  230400.0   90983.0   35120.0 33487.8 4656.0 4334.9     18    0.243   8      0.484    0.727
    实时监控结果:10秒内5次GC,总耗时0.35。 如果有多线程,一定要调大参数
    xxxxx
    2、 降低耗时,设置-XX:MaxGCPauseMills=10   java -Xmx1024m -Xloggc:/xxxxx/gc3.log -XX:MaxGCPauseMillis=10  -jar performance-1.0.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    12800.0 18944.0  0.0    0.0   121856.0 15777.8   176640.0   86351.4   35120.0 33512.4 4656.0 4333.5     21    0.217  11      0.523    0.740
    12800.0 22016.0  0.0    0.0   121856.0 54705.3   185856.0   88403.0   35120.0 33513.2 4656.0 4333.5     22    0.230  12      0.568    0.798
    25088.0 22016.0  0.0    0.0   121856.0 91971.1   188416.0   88918.6   35120.0 33513.2 4656.0 4333.5     23    0.243  13      0.613    0.856
    33280.0 29184.0  0.0    0.0   117760.0 31698.5   183296.0   88412.8   35120.0 33513.2 4656.0 4333.5     25    0.268  15      0.707    0.975
    33280.0 38912.0  0.0    0.0   112128.0 91608.5   179200.0   88928.0   35120.0 33513.2 4656.0 4333.5     26    0.280  16      0.754    1.035
    45056.0 52224.0  0.0    0.0   104960.0 64733.6   174080.0   88420.9   35120.0 33513.7 4656.0 4333.5     28    0.305  18      0.844    1.149
    60416.0 70144.0  0.0    0.0   95232.0  51840.1   173568.0   89100.1   35120.0 33514.1 4656.0 4333.5     30    0.331  19      0.891    1.222
    74752.0 86016.0 71714.2  0.0   83968.0  79793.1   173568.0   89100.1   35120.0 33514.1 4656.0 4333.5     32    0.355  19      0.891    1.245
    108032.0 102400.0  0.0   72770.2 76800.0  62256.3   173568.0   89100.1   35120.0 33514.8 4656.0 4333.5     35    0.392  19    0.891    1.283
    116224.0 116224.0  0.0   73282.2 71680.0   3641.2   173568.0   89108.1   35120.0 33518.8 4656.0 4333.5     39    0.441  19    0.891    1.331
    实时监控结果:10秒内18次YGC,8次FGC,GC次数变多,总的时间反倒变长。 代表单次GC时间加速,会换来更多的GC次数,这种情况下不合适。
    
    # CMS
    3、 改用CMS回收器  java -Xmx1024m -Xloggc:/xxxxx/gc4.log -XX:+UseConcMarkSweepGC  -jar performance-1.0.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    2048.0 2048.0 1540.4  0.0   16384.0   3091.6   166784.0   144616.6  35144.0 33474.4 4680.0 4334.1     84    0.415  39      0.235    0.651
    2048.0 2048.0 1540.4  0.0   16384.0    0.0     195804.0   166637.9  35144.0 33477.0 4680.0 4334.1     92    0.450  44      0.271    0.721
    2048.0 2048.0 1538.4  0.0   16384.0   5661.8   195804.0   125169.0  35144.0 33477.0 4680.0 4334.1    100    0.480  49      0.298    0.778
    2048.0 2048.0 1538.4  0.0   16384.0   5153.7   217156.0   187639.7  35144.0 33477.4 4680.0 4334.1    110    0.520  53      0.323    0.843
    2048.0 2048.0  0.0   1540.4 16384.0    0.0     241052.0   207613.3  35144.0 33477.4 4680.0 4334.1    121    0.564  57      0.347    0.911
    2048.0 2048.0  0.0   1540.4 16384.0   8773.2   241052.0   185600.7  35144.0 33477.4 4680.0 4334.1    131    0.603  61      0.371    0.974
    2048.0 2048.0  0.0   1538.4 16384.0    0.0     242600.0   160004.8  35144.0 33477.4 4680.0 4334.1    143    0.649  65      0.396    1.045
    2048.0 2048.0  0.0   1540.4 16384.0   4648.6   381032.0   228619.2  35144.0 33478.1 4680.0 4334.1    155    0.709  66      0.409    1.118
    2048.0 2048.0 1566.2  0.0   16384.0   5402.5   381548.0   374564.8  35400.0 33721.3 4680.0 4364.3    168    0.782  67      0.410    1.192
    实时监控结果:10秒内85次YGC,28次FGC,总耗时0.54。 cms这种高频回收并不是适合这个场景。
    4、 增加线程 java -Xmx1024m -Xloggc:/xxxxx/gc4.log -XX:+UseConcMarkSweepGC  -XX:ConcGCThreads=3 -jar performance-1.0.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    2048.0 2048.0  0.0   1538.8 16384.0   7246.8   156612.0   80654.6   35196.0 33516.0 4732.0 4333.0     73    0.364  38      0.225    0.589
    2048.0 2048.0 1538.4  0.0   16384.0   5170.8   163448.0   84756.2   35196.0 33516.3 4732.0 4333.0     80    0.393  42      0.250    0.643
    2048.0 2048.0 1540.4  0.0   16384.0    0.0     177112.0   146202.8  35196.0 33517.5 4732.0 4333.0     88    0.423  46      0.275    0.698
    2048.0 2048.0 1540.8  0.0   16384.0   8246.7   203568.0   125726.2  35196.0 33519.0 4732.0 4333.0     96    0.455  50      0.299    0.754
    2048.0 2048.0 1540.4  0.0   16384.0    0.0     213816.0   158500.2  35196.0 33519.0 4732.0 4333.0    106    0.497  55      0.325    0.822
    2048.0 2048.0 1538.4  0.0   16384.0    0.0     217236.0   157992.8  35196.0 33519.3 4732.0 4333.0    116    0.536  59      0.349    0.886
    2048.0 2048.0 1540.8  0.0   16384.0    0.0     259916.0   167213.6  35196.0 33519.3 4732.0 4333.0    126    0.577  62      0.373    0.950
    2048.0 2048.0  0.0   1538.4 16384.0    0.0     259916.0   211763.6  35196.0 33519.3 4732.0 4333.0    137    0.617  65      0.387    1.004
    2048.0 2048.0  0.0   1536.0 16384.0   3608.3   349532.0   256826.1  35196.0 33519.3 4732.0 4333.0    149    0.682  67      0.399    1.081
    2048.0 2048.0  0.0   1540.4 16384.0   3087.0   349532.0   250174.0  35196.0 33520.5 4732.0 4333.0    161    0.726  69      0.412    1.139
    实时监控结果:10秒内88次YGC,31次FGC,总耗时0.55,差不多的情况。
    # G1 建议大堆使用
    5、 改用G1 java -Xmx1024m -Xloggc:/xxxxx/gc10.log  -XX:+UseG1GC -jar performance-1.0.0.jar
    S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
     0.0    0.0    0.0    0.0   55296.0   4096.0   993280.0   244610.8  35200.0 33464.4 4736.0 4333.5    168    1.229   0      0.000    1.229
     0.0    0.0    0.0    0.0   55296.0   6144.0   993280.0   411220.0  35200.0 33466.3 4736.0 4333.5    177    1.414   0      0.000    1.414
     0.0    0.0    0.0    0.0   660480.0 17408.0   388096.0   248910.9  35200.0 33466.3 4736.0 4333.5    187    1.645   0      0.000    1.645
     0.0    0.0    0.0    0.0   613376.0 39936.0   435200.0   435196.7  35200.0 33466.3 4736.0 4333.5    197    1.863   0      0.000    1.863
     0.0    0.0    0.0    0.0   55296.0   6144.0   993280.0   502275.2  35200.0 33466.3 4736.0 4333.5    206    2.088   0      0.000    2.088
     0.0    0.0    0.0    0.0   55296.0   6144.0   993280.0   497159.3  35200.0 33466.3 4736.0 4333.5    216    2.320   0      0.000    2.320
     0.0    0.0    0.0    0.0   493568.0 41984.0   555008.0   553992.8  35200.0 33466.3 4736.0 4333.5    227    2.556   0      0.000    2.556
     0.0    0.0    0.0    0.0   660480.0  1024.0   388096.0   205221.1  35200.0 33466.3 4736.0 4333.5    237    2.822   0      0.000    2.822
     0.0    0.0    0.0    0.0   55296.0   6144.0   993280.0   464105.0  35200.0 33466.7 4736.0 4333.5    247    3.056   0      0.000    3.056
     0.0    0.0    0.0    0.0   570368.0 38912.0   478208.0   477630.5  35200.0 33469.3 4736.0 4333.5    258    3.322   0      0.000    3.322
    实时监控结果:不行...
    6、增加分区大小 java -Xmx1024m -Xloggc:/xxxxx/gc11.log  -XX:+UseG1GC -XX:G1HeapRegionSize=64m -jar performance-1.0.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
     0.0   32768.0  0.0   32768.0 65536.0    0.0     360448.0   248859.1  35196.0 33493.9 4732.0 4333.3    123    1.723   0      0.000    1.723
     0.0   32768.0  0.0   32768.0 163840.0 65536.0   262144.0   150835.5  35196.0 33493.9 4732.0 4333.3    127    1.784   0      0.000    1.784
     0.0   32768.0  0.0   32768.0 65536.0    0.0     360448.0   194563.3  35196.0 33493.9 4732.0 4333.3    132    1.834   0      0.000    1.834
     0.0   32768.0  0.0   32768.0 131072.0   0.0     294912.0   192001.0  35196.0 33493.9 4732.0 4333.3    136    1.880   0      0.000    1.880
     0.0   32768.0  0.0   32768.0 196608.0   0.0     229376.0   111728.2  35196.0 33493.9 4732.0 4333.3    142    1.943   0      0.000    1.943
     0.0   32768.0  0.0   32768.0 131072.0 65536.0   294912.0   180224.5  35196.0 33493.9 4732.0 4333.3    144    1.972   0      0.000    1.972
     0.0   32768.0  0.0   32768.0 163840.0 98304.0   262144.0   126091.5  35196.0 33493.9 4732.0 4333.3    150    2.036   0      0.000    2.036
     0.0   32768.0  0.0   32768.0 98304.0  32768.0   327680.0   201220.0  35196.0 33493.9 4732.0 4333.3    154    2.081   0      0.000    2.081
     0.0   32768.0  0.0   32768.0 163840.0 65536.0   262144.0   144384.5  35196.0 33493.9 4732.0 4333.3    159    2.132   0      0.000    2.132
     0.0   32768.0  0.0   32768.0 196608.0   0.0     229376.0   107380.4  35196.0 33493.9 4732.0 4333.3    166    2.199   0      0.000    2.199
    
    • 2、 示例代码 -2
    // 启动程序,模拟用户请求
    // 每100毫秒钟创建1000线程,每个线程创建一个512kb的对象,最多100毫秒内同时存在1000线程,并发量1000/s,吞吐量6000/s,查看GC的情况
    @SpringBootApplication
    public class PerformanceApplication {
        public static void main(String[] args) {
            SpringApplication.run(PerformanceApplication.class, args);
            Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -&gt; {
                new Thread(() -&gt; {
                    for (int i = 0; i &lt; 1000; i++) {
                        try {
                            //  不干活,专门512kb的小对象
                            byte[] temp = new byte[1024 * 512];
                            Thread.sleep(new Random().nextInt(100)); // 随机睡眠200毫秒秒以内
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }, 100, 100, TimeUnit.MILLISECONDS);
        }
    }
    
    // 打包 mvn clean package
    // 服务器上运行 performance-1.1.0.jar
    // 对象存活时间短,处理量大,属于响应时间优先
    
    • 2.1 GC调优
    # 实时监控:jstat -gc -h10 $(jcmd | grep "performance-1.1.0.jar" | awk '{print $1}') 1000
    # Parallel GC  服务器默认  java -Xmx1024m -Xloggc:/xxxxx/gc6.log -jar performance-1.1.0.jar
    UseAdaptiveSizePolicy自适应默认开启,所以Eden区会自动变化大小
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    37376.0 37888.0 34817.1  0.0   272384.0 92500.6   125952.0   57532.9   35120.0 33541.2 4656.0 4335.4    286    2.698   7      0.360    3.059
    36864.0 36864.0 32289.0  0.0   275456.0   0.0     125952.0   87877.8   35120.0 33541.2 4656.0 4335.4    300    2.812   7      0.360    3.173
    35328.0 35840.0 31777.0  0.0   276480.0   0.0     128000.0   61118.4   35120.0 33542.5 4656.0 4335.4    314    2.924   8      0.404    3.328
    34816.0 34816.0 31297.0  0.0   279552.0 139082.4  128000.0   102215.6  35120.0 33555.8 4656.0 4335.4    328    3.029   8      0.404    3.433
    33792.0 33792.0 30752.9  0.0   281600.0 181082.7  130048.0   68303.1   35120.0 33555.8 4656.0 4335.4    342    3.138   9      0.448    3.586
    33280.0 33280.0  0.0   29728.9 282624.0 132715.1  130048.0   122168.7  35120.0 33555.8 4656.0 4335.4    357    3.254   9      0.448    3.701
    33280.0 33280.0 25152.8  0.0   282624.0 78765.8   132608.0   98078.6   35120.0 33556.9 4656.0 4335.4    372    3.361  10      0.490    3.851
    31232.0 27136.0  0.0   26688.8 285696.0 136307.1  136704.0   76004.6   35120.0 33558.1 4656.0 4335.4    387    3.479  11      0.542    4.021
    31744.0 31232.0 26656.8  0.0   286208.0   0.0     138752.0   49337.7   35120.0 33558.1 4656.0 4335.4    402    3.595  12      0.585    4.180
    29184.0 29184.0 25152.8  0.0   289792.0   0.0     138752.0   112435.6  35120.0 33558.1 4656.0 4335.4    418    3.716  12      0.585    4.301
    默认情况,实时监控结果:10秒内132次YGC,5次FullGC,单词YGC耗时0.008s,总耗时1.242秒
    
    1、 调大-XX:ParallelGCThreads=4  java -Xmx1024m -Xloggc:/xxxxx/gc7.log -XX:ParallelGCThreads=4  -jar performance-1.1.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    47616.0 48128.0 43073.3  0.0   252416.0 227997.7  130560.0   122261.9  35120.0 33506.0 4656.0 4334.8    197    2.479   6      0.359    2.838
    47104.0 47104.0 43105.3  0.0   254976.0 153173.5  116736.0   67205.9   35120.0 33506.0 4656.0 4334.8    208    2.629   7      0.405    3.034
    46080.0 46080.0 44097.3 42529.3 257024.0   0.0     116736.0   86822.5   35120.0 33506.0 4656.0 4334.8   221    2.767   7      0.405    3.172
    45568.0 45568.0  0.0   42049.3 258048.0 129250.1  116736.0   104391.0  35120.0 33506.0 4656.0 4334.8    233    2.933   7      0.405    3.338
    44544.0 44544.0  0.0   43041.3 260096.0 27359.1   120320.0   68802.0   35120.0 33506.0 4656.0 4334.8    245    3.111   8      0.463    3.574
    44544.0 44544.0 39937.2  0.0   260096.0 51577.7   120320.0   97642.8   35120.0 33506.0 4656.0 4334.8    258    3.283   8      0.463    3.746
    44544.0 36864.0  0.0   36353.1 261120.0  7862.2   121856.0   68276.2   35120.0 33506.0 4656.0 4334.8    271    3.439   9      0.508    3.947
    42496.0 42496.0  0.0   37441.1 263680.0   0.0     121856.0   106301.3  35120.0 33506.0 4656.0 4334.8    285    3.654   9      0.508    4.162
    40960.0 41472.0 37889.2  0.0   265216.0   0.0     122880.0   85228.3   35120.0 33506.0 4656.0 4334.8    298    3.834  10      0.551    4.385
    41472.0 41472.0 37441.1  0.0   266240.0   0.0     123904.0   57506.1   35120.0 33515.1 4656.0 4334.8    312    4.010  11      0.595    4.605
    实时监控结果:10秒内115次GC,5次fullGC,总耗时1.767,单次YGC时间0.014s 多线程,也不管用
    
    2、 降低耗时,设置-XX:MaxGCPauseMills=5   java -Xmx1024m -Xloggc:/xxxxx/gc8.log -XX:MaxGCPauseMillis=5  -jar performance-1.1.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    11264.0 12800.0  0.0    0.0   50688.0    0.0     48128.0    28445.5   35200.0 33483.7 4736.0 4334.6     22    0.136   3      0.184    0.320
    26624.0 25088.0  0.0   18496.6 44032.0  11192.5   48128.0    32045.6   35200.0 33483.7 4736.0 4334.6     29    0.165   3      0.184    0.349
    33792.0 34304.0 21504.7  0.0   39424.0  11034.2   48128.0    36789.8   35200.0 33483.7 4736.0 4334.6     40    0.218   3      0.184    0.401
    34304.0 34816.0 27712.8  0.0   37888.0    0.0     64512.0    44331.6   35200.0 33483.9 4736.0 4334.6     54    0.296   5      0.266    0.561
    32768.0 26624.0  0.0    0.0   37888.0    0.0     76288.0    49968.7   35200.0 33483.9 4736.0 4334.6     69    0.385   9      0.429    0.815
    47616.0 48640.0 39489.2  0.0   28672.0    0.0     84992.0    54068.5   35200.0 33483.9 4736.0 4334.6     92    0.543  11      0.513    1.056
    57856.0 57856.0  0.0   19968.6 20480.0   9283.9   100352.0   59194.0   35200.0 33484.9 4736.0 4334.6    123    0.764  15      0.682    1.446
    35840.0 36864.0 13312.4  0.0   13824.0    0.0     115200.0   88901.4   35200.0 33487.8 4736.0 4335.7    172    1.076  26      1.113    2.188
    24576.0 17408.0  0.0   16896.5  9216.0    0.0     99840.0    82761.6   35200.0 33488.2 4736.0 4335.7    227    1.363  40      1.757    3.121
    14848.0 14848.0 9216.3  0.0    6144.0    0.0     95744.0    84799.3   35200.0 33488.5 4736.0 4335.7    310    1.657  55      2.399    4.056
    实时监控结果:结果不太好,不合适。
    
    # CMS
    3、 改用CMS回收器  java -Xmx1024m -Xloggc:/xxxxx/gc9.log -XX:+UseConcMarkSweepGC  -jar performance-1.1.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    2048.0 2048.0 1536.0  0.0   16384.0    0.0     848412.0   836821.7  35220.0 33468.3 4756.0 4331.8    116    0.804   7      0.037    0.841
    17024.0 17024.0 16901.3  0.0   136320.0 91188.6   878208.0   75373.9   35220.0 33468.5 4756.0 4331.8    122    0.859   8      0.114    0.973
    17024.0 17024.0  0.0   16901.3 136320.0 90524.2   878208.0   154741.3  35220.0 33468.5 4756.0 4331.8    127    0.900   8      0.114    1.015
    17024.0 17024.0  0.0   16901.3 136320.0 67869.0   878208.0   279165.8  35220.0 33468.5 4756.0 4331.8    133    0.953   8      0.114    1.068
    17024.0 17024.0 16898.9  0.0   136320.0 29055.4   878208.0   462985.0  35220.0 33469.5 4756.0 4331.8    140    1.020   8      0.114    1.134
    17024.0 17024.0  0.0   16898.9 136320.0 32667.9   878208.0   681621.7  35220.0 33472.4 4756.0 4332.9    147    1.089   8      0.114    1.204
    17024.0 17024.0  0.0   16902.3 136320.0 27188.4   878208.0   294018.9  35220.0 33472.8 4756.0 4332.9    155    1.174  10      0.128    1.302
    17024.0 17024.0 16900.9  0.0   136320.0   0.0     878208.0   607890.7  35220.0 33473.4 4756.0 4332.9    164    1.266  10      0.128    1.394
    17024.0 17024.0  0.0   16898.9 136320.0 80996.3   878208.0   225418.4  35220.0 33475.7 4756.0 4332.9    173    1.358  12      0.140    1.499
    17024.0 17024.0 16898.9  0.0   136320.0   0.0     878208.0   607899.4  35220.0 33475.7 4756.0 4332.9    184    1.470  12      0.140    1.611
    实时监控结果:高频回收,会抢占用户线程,根据实际需要进行调优
    
    # G1 建议大堆使用
    4、 改用G1 java -Xmx1024m -Xloggc:/xxxxx/gc10.log  -XX:+UseG1GC -jar performance-1.1.0.jar
    S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
     0.0    0.0    0.0    0.0   55296.0   8192.0   993280.0   592928.3  35200.0 33534.8 4736.0 4331.4    272    3.725   0      0.000    3.725
     0.0    0.0    0.0    0.0   55296.0   8192.0   993280.0   597028.5  35200.0 33534.8 4736.0 4331.4    284    3.988   0      0.000    3.988
     0.0    0.0    0.0    0.0   55296.0   7168.0   993280.0   490485.7  35200.0 33535.9 4736.0 4331.4    295    4.299   0      0.000    4.299
     0.0    0.0    0.0    0.0   55296.0   8192.0   993280.0   603137.7  35200.0 33537.1 4736.0 4331.4    308    4.568   0      0.000    4.568
     0.0    0.0    0.0    0.0   641024.0 22528.0   407552.0   392447.4  35200.0 33537.1 4736.0 4331.4    319    4.869   0      0.000    4.869
     0.0    0.0    0.0    0.0   55296.0   2048.0   993280.0   316671.2  35200.0 33537.1 4736.0 4331.4    330    5.151   0      0.000    5.151
     0.0    0.0    0.0    0.0   55296.0   7168.0   993280.0   614372.8  35200.0 33537.1 4736.0 4331.4    342    5.408   0      0.000    5.408
     0.0    0.0    0.0    0.0   449536.0 44032.0   599040.0   598790.9  35200.0 33537.1 4736.0 4331.4    355    5.715   0      0.000    5.715
     0.0    0.0    0.0    0.0   55296.0   1024.0   993280.0   299773.5  35200.0 33537.1 4736.0 4331.4    367    6.045   0      0.000    6.045
     0.0    0.0    0.0    0.0   55296.0   7168.0   993280.0   625419.5  35200.0 33537.1 4736.0 4331.4    380    6.335   0      0.000    6.335
     实时监控结果:难看的数据
    5、增加分区大小 java -Xmx1024m -Xloggc:/xxxxx/gc11.log  -XX:+UseG1GC -XX:G1HeapRegionSize=64m -jar performance-1.1.0.jar
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
     0.0   65536.0  0.0   65536.0 327680.0 262144.0  229376.0   43625.6   35196.0 33417.9 4732.0 4335.1     84    0.899   0      0.000    0.899
     0.0   65536.0  0.0   65536.0 327680.0 229376.0  229376.0   44153.1   35196.0 33417.9 4732.0 4335.1     89    0.944   0      0.000    0.944
     0.0   65536.0  0.0   65536.0 327680.0   0.0     229376.0   43658.6   35196.0 33417.9 4732.0 4335.1     95    1.001   0      0.000    1.001
     0.0   65536.0  0.0   65536.0 327680.0 196608.0  229376.0   43673.1   35196.0 33417.9 4732.0 4335.1    100    1.047   0      0.000    1.047
     0.0   65536.0  0.0   65536.0 327680.0 131072.0  229376.0   43690.6   35196.0 33417.9 4732.0 4335.1    106    1.113   0      0.000    1.113
     0.0   65536.0  0.0   65536.0 327680.0 196608.0  229376.0   43705.6   35196.0 33417.9 4732.0 4335.1    112    1.181   0      0.000    1.181
     0.0   65536.0  0.0   65536.0 327680.0 98304.0   229376.0   44236.6   35196.0 33418.6 4732.0 4335.1    119    1.271   0      0.000    1.271
     0.0   65536.0  0.0   65536.0 327680.0 131072.0  229376.0   43743.6   35196.0 33419.1 4732.0 4335.1    126    1.360   0      0.000    1.360
     0.0   65536.0  0.0   65536.0 327680.0 196608.0  229376.0   44274.6   35196.0 33419.8 4732.0 4335.1    133    1.461   0      0.000    1.461
     0.0   65536.0  0.0   65536.0 393216.0 196608.0  262144.0   43781.6   35196.0 33419.8 4732.0 4335.1    140    1.546   0      0.000    1.546
    
    • 3、 结语
      主要是演示切换的过程和思路,实际还是要结合系统情况、系统需要来调整。
      1、 GC调优就是逐步调试的过程,对每个参数的含义了解后,再根据官方手册,一个个调试,找到符合应用的最佳配置点。是一个细致活,难度高。
      2、 再重复一句,性能问题,98.75%上是业务代码上面。
      3、 无监控,不调优。

    如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

        本文标题:JVM性能优化 - JVM参数及调优

        本文链接:https://www.haomeiwen.com/subject/ylyemrtx.html