前言
测试环境:JVM配置为2核1G,JAVA8,固定设置堆大小 1G
近来,聊到Java调优问题,特做个记录,希望大家能一起学习下。
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
// 启动程序,模拟用户请求 // 每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:/netease/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:/netease/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:/netease/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。如果有多线程,一定要调大参数 2、 降低耗时,设置-XX:MaxGCPauseMills=10 java -Xmx1024m -Xloggc:/netease/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:/netease/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:/netease/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:/netease/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:/netease/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