一篇搞定java调优的实战配置(上)

简介: 一篇搞定java调优的实战配置

前言

测试环境: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


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
450 119
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
3822 8
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1739 12
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
706 100
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1404 0
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
算法 Java 开发者
Java流程控制:条件与循环结构实战
本文深入讲解编程中的流程控制结构,涵盖条件语句(if-else、switch)、循环结构(for、while、do-while)及循环控制关键字(break、continue)的使用技巧与实战案例,帮助开发者写出更清晰、高效的代码。
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1972 1
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
1710 4