JVM基本概念、命令、参数、GC日志总结

news2024/9/22 9:40:07

原文: 赵侠客

一、前言

NPE(NullPointerException)和OOM(OutofMemoryError)在JAVA程序员中扮演着重要的角色,它也是很多人始终摆脱不掉的梦魇,与NPE不同的是OOM一旦在生产环境中出现就意味着只靠代码已经无法解决代码自身的问题,只能从软件架构层面来下架不可用的服务,从而减少OOM带来的不可估量的损失。了解JVM基本原理、合理地配置JVM参数、不仅可以提高服务稳定性,还能提升服务并发能力。不过随着容器化的发展和硬件性能的提升,很多公司都是通过提升硬件性能来增加服务的吞吐量,这也导致很多程序员也没有太多的机会去了解JVM、监控JVM、优化JVM参数设置,通过合理的配置JVM参数是ROA最高的提升性能方法。本文主要从四个方面抛砖引玉地介绍优化JVM的基本知识架构:

  1. 简单认识JAVA的堆结构,优化JVM主要是减少GC次数和GC时间,GC就是对堆的内存的回收;
  2. jstat命令的使用,通过jstat我们可以直观地查看堆上各区域的内存大小和GC时间,从而判断我们JVM参数设置的是否合理;
  3. JVM常用参数的使用,我们通过jstat来判断参数设置是否合理,通过JVM参数来设置我们的参数;
  4. JVM GC日志的分析,jstat适用于实时查看堆结构,GC日志是可以持久化记录GC的详细过程,通过分析GC日志能更好的帮助我们洞察GC的细节。

二、JVM基本概念

JVM基本概念、命令、参数、GC日志总结-流程图.jpg

JVM内存结构

  1. 非堆区结构

    1. Metaspace(元空间):这部分内存主要用于存放类的元数据。在JDK8中,元空间取代了永久代,元空间的最大空间受系统的实际可用空间限制,可通过-XX:MetaspaceSize=128m来设置
    2. Code Cache(代码缓存):存放编译后的本地代码。
    3. Direct Memory(直接内存):这部分内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁使用。如果在程序中频繁使用NIO,那么在这部分内存中分配的内存也会增加。因此,对Direct Memory的使用也需要进行监控。
    4. JVM自身进程占用的内存:JVM进程自身也需要消耗一部分内存,虽然这部分内存与Java程序直接运行没有直接关系,但是也不能忽视。
    5. 常量池:这部分内存主要用于存放常量信息,包括直接常量(如字符串、数字)和符号引用(如类和接口的全局限定名、字段的名称和描述符、方法的名称和描述符)。
    6. 静态变量:存放类的静态变量。
  2. 堆区结构 (初始化值-Xms4096m,最大值-Xmx4096m )

    1. Old区(老年代)默认大小为 Old:Young=2:1, 通过-XX:NewRatio=2参数设置
    2. Young区 (新生代)(初始化值-XX:NewSize=64m,最大值XX:MaxNewSize=64m)
      1. Eden (伊甸区)
      2. Survivor区 (幸存区)
        1. S0区又称From区 ,默认大小比例为 Eden:S0:S1=8:1:1 通过–XX:SurvivorRatio=8参数设置
        2. S1区又称To区 , S0和S1一样大,也可以叫From和To。
  3. GC类型Minor/Major/Full GC

    1. 新生代收集(Minor GC / Young GC):只是新生代(Eden、S0,S1)的垃圾收集
    2. 老年代收集(Major GC / Old GC):只是老年代的垃圾收集
    3. 整堆收集(Full GC) :新生代(Minor GC)+老年代(Major GC) Full GC
  4. GC过程

三、jstat命令使用大全

jstat -options 查看所有可选项

 jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

jstat -options pid 加载类统计

jstat  -class  24410 1000 5
Loaded  Bytes  Unloaded  Bytes     Time   
  7259 13569.5        0     0.0       1.42
  7259 13569.5        0     0.0       1.42
  7259 13569.5        0     0.0       1.42
  7259 13569.5        0     0.0       1.42
  7259 13569.5        0     0.0       1.42
字段名称表示含义
Loaded加载class类的数量
Bytes所占内存空间
Unloaded未加载类的数量
Bytes未加载类内存空间
Time消耗时间

jstat -compiler pid 编译统计

jstat  -compiler  24410 1000 5
Compiled Failed Invalid   Time   FailedType FailedMethod
    4099      3       0     5.50          1 java/util/concurrent/locks/AbstractQueuedSynchronizer release
    4099      3       0     5.50          1 java/util/concurrent/locks/AbstractQueuedSynchronizer release
    4099      3       0     5.50          1 java/util/concurrent/locks/AbstractQueuedSynchronizer release
    4099      3       0     5.50          1 java/util/concurrent/locks/AbstractQueuedSynchronizer release
    4099      3       0     5.50          1 java/util/concurrent/locks/AbstractQueuedSynchronizer release
字段名称表示含义
Compiler编译成功数量
Failed编译失败数量
Invalid编译无效数量
Time编译耗时
FailedType编译失败的类型
FailedMethod编译失败的方法

jstat -gc pid interval count 垃圾回收按字节大小统计

基本用法: jstat -gc 进程号 统计间隔 统计次数

例如 : jstat -gc 24410 1000 5 每1000毫秒统计一次进程号为24410的垃圾回收情况,总共统计5次

jstat -gc 24410 1000 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
9216.0 7680.0  0.0    0.0   220672.0 124038.5  139776.0   13252.0   35424.0 33384.6 4608.0 4222.4      7    0.024   2      0.061    0.085
9216.0 7680.0  0.0    0.0   220672.0 124038.5  139776.0   13252.0   35424.0 33384.6 4608.0 4222.4      7    0.024   2      0.061    0.085
9216.0 7680.0  0.0    0.0   220672.0 124038.5  139776.0   13252.0   35424.0 33384.6 4608.0 4222.4      7    0.024   2      0.061    0.085
9216.0 7680.0  0.0    0.0   220672.0 124038.5  139776.0   13252.0   35424.0 33384.6 4608.0 4222.4      7    0.024   2      0.061    0.085
9216.0 7680.0  0.0    0.0   220672.0 124038.5  139776.0   13252.0   35424.0 33384.6 4608.0 4222.4      7    0.024   2      0.061    0.085

结果含义:

字段名称表示含义
S0C幸存区1容量(单位:字节)
S1C幸存区2容量(单位:字节)
S0U幸存区1使用容量(单位:字节)
S1U幸存区2使用容量(单位:字节)
EC伊甸园区容量(单位:字节)
EU伊甸园区使用容量(单位:字节)
OC老年区容量(单位:字节)
OU老年区使用容量(单位:字节)
MCMetaspace区容量(单位:字节)
MUMetaspace区使用容量(单位:字节)
CCSC压缩类空间容量(单位:字节)
CCSU压缩类空间使用容量(单位:字节)
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间(单位:秒)
GCT垃圾回收器总耗时时间(单位:秒)

jstat -gccapacity pid interval count JVM各内存空间统计

 jstat  -gccapacity 24410 1000 5 
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 87040.0 1397760.0 373248.0 9216.0 7680.0 220672.0   175104.0  2796544.0   139776.0   139776.0      0.0 1081344.0  35424.0      0.0 1048576.0   4608.0      7     2
 87040.0 1397760.0 373248.0 9216.0 7680.0 220672.0   175104.0  2796544.0   139776.0   139776.0      0.0 1081344.0  35424.0      0.0 1048576.0   4608.0      7     2
 87040.0 1397760.0 373248.0 9216.0 7680.0 220672.0   175104.0  2796544.0   139776.0   139776.0      0.0 1081344.0  35424.0      0.0 1048576.0   4608.0      7     2
 87040.0 1397760.0 373248.0 9216.0 7680.0 220672.0   175104.0  2796544.0   139776.0   139776.0      0.0 1081344.0  35424.0      0.0 1048576.0   4608.0      7     2
 87040.0 1397760.0 373248.0 9216.0 7680.0 220672.0   175104.0  2796544.0   139776.0   139776.0      0.0 1081344.0  35424.0      0.0 1048576.0   4608.0      7     2
字段名称表示含义
NGCMN年轻代gc最小容量(单位:字节)
NGCMX年轻代gc最大容量(单位:字节)
NGC当前年轻代容量(单位:字节)
S0C幸存区0容量(单位:字节)
S1C幸存区1容量(单位:字节)
EC伊甸园容量(单位:字节)
OGCMN老年代gc最小容量(单位:字节)
OGCMX老年代gc最大容量(单位:字节)
OGC当前老年代gc容量(单位:字节)
OC当前老年代容量(单位:字节)
MCMN元数据最小容量(单位:字节)
MCMX元数据最大容量(单位:字节)
MC当前元数据使用容量(单位:字节)
CCSMN压缩类最小容量(单位:字节)
CCSMX压缩类最大容量(单位:字节)
CCSC当前压缩类容量(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
FGC从应用程序启动到现在,老年代垃圾回收次数

jstat -gccause pid interval count 垃圾回收器分析统计

 jstat  -gccause 24410 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
  0.00   0.00  56.21   9.48  94.24  91.63      7    0.024     2    0.061    0.085 Metadata GC Threshold No GC               
  0.00   0.00  56.21   9.48  94.24  91.63      7    0.024     2    0.061    0.085 Metadata GC Threshold No GC               
  0.00   0.00  56.21   9.48  94.24  91.63      7    0.024     2    0.061    0.085 Metadata GC Threshold No GC               
  0.00   0.00  56.21   9.48  94.24  91.63      7    0.024     2    0.061    0.085 Metadata GC Threshold No GC               
  0.00   0.00  56.21   9.48  94.24  91.63      7    0.024     2    0.061    0.085 Metadata GC Threshold No GC   
字段名称表示含义
S0幸存区1使用百分比
S1幸存区2使用百分比
E伊甸园区使用百分比
O老年代使用百分比
M元数据使用百分比
CCS压缩类使用百分比
YGC从应用程序启动到现在,年轻代垃圾回收次数
YGCT从应用程序启动到现在,年轻代垃圾回收消耗时间(单位:秒)
FGC从应用程序启动到现在,老年代垃圾回收次数
FGCT从应用程序启动到现在,老年代垃圾回收消耗时间(单位:秒)
GCT从应用程序启动到现在,垃圾回收器总消耗时间(单位:秒)
LGCT
GCC

jstat -gcmetacapacity pid interval count 元数据内存垃圾回收统计

jstat  -gcmetacapacity 24410 1000 5
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1081344.0    35424.0        0.0  1048576.0     4608.0     7     2    0.061    0.085
       0.0  1081344.0    35424.0        0.0  1048576.0     4608.0     7     2    0.061    0.085
       0.0  1081344.0    35424.0        0.0  1048576.0     4608.0     7     2    0.061    0.085
       0.0  1081344.0    35424.0        0.0  1048576.0     4608.0     7     2    0.061    0.085
       0.0  1081344.0    35424.0        0.0  1048576.0     4608.0     7     2    0.061    0.085
字段名称表示含义
MCMN元数据最小容量(单位:字节)
MCMX元数据最大容量(单位:字节)
MC当前元数据容量大小(单位:字节)
CCSMN压缩类最小空间容量(单位:字节)
CCSMX压缩类最大空间容量(单位:字节)
CCSC当前压缩类容量大小(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
FGC从应用程序启动到现在,老年代垃圾回收次数
FGCT从应用程序启动到现在,老年代垃圾回收消耗时间(单位:秒)
GCT从应用程序启动到现在,垃圾回收总消耗时间(单位:秒)

jstat -gcnew pid interval count 新生代垃圾回收器分析统计

jstat  -gcnew 24410 1000 5
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
9216.0 7680.0    0.0    0.0  4  15 9216.0 220672.0 124038.5      7    0.024
9216.0 7680.0    0.0    0.0  4  15 9216.0 220672.0 124038.5      7    0.024
9216.0 7680.0    0.0    0.0  4  15 9216.0 220672.0 124038.5      7    0.024
9216.0 7680.0    0.0    0.0  4  15 9216.0 220672.0 124038.5      7    0.024
9216.0 7680.0    0.0    0.0  4  15 9216.0 220672.0 124038.5      7    0.024
字段名称表示含义
S0C幸存区1容量(单位:字节)
S1C幸存区2容量(单位:字节)
S0U幸存区1使用容量(单位:字节)
S1U幸存区2使用容量(单位:字节)
TT对象在年轻代存活的次数
MTT对象在年轻代存货的最大次数
DSS指望的幸存区容量(单位:字节)
EC伊甸园容量(单位:字节)
EU伊甸园使用容量(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
YGCT从应用程序启动到现在,年轻代垃圾回收消耗时间(单位:秒)

jstat -gcnewcapacity pid interval count 新生代垃圾回收器分析统计

jstat  -gcnewcapacity 24410 1000 5 
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   87040.0  1397760.0   373248.0 465920.0   9216.0 465920.0   7680.0  1396736.0   220672.0     7     2
   87040.0  1397760.0   373248.0 465920.0   9216.0 465920.0   7680.0  1396736.0   220672.0     7     2
   87040.0  1397760.0   373248.0 465920.0   9216.0 465920.0   7680.0  1396736.0   220672.0     7     2
   87040.0  1397760.0   373248.0 465920.0   9216.0 465920.0   7680.0  1396736.0   220672.0     7     2
   87040.0  1397760.0   373248.0 465920.0   9216.0 465920.0   7680.0  1396736.0   220672.0     7     2
字段名称表示含义
NGCMN年轻代最小容量(单位:字节)
NGCMX年轻代最大容量(单位:字节)
NGC当前年轻代容量大小(单位:字节)
S0CMX幸存区1最大容量(单位:字节)
S1CMX幸存区2最大容量(单位:字节)
S1C当前幸存区2容量大小(单位:字节)
ECMX伊甸园最大的容量(单位:字节)
EC当前伊甸园容量(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
FGC从应用程序启动到现在,老年代垃圾回收次数

jstat -gcold pid interval count 老垃圾回收器分析统计

jstat  -gcold  24410 1000 5
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 35424.0  33384.6   4608.0   4222.4    139776.0     13252.0      7     2    0.061    0.085
 35424.0  33384.6   4608.0   4222.4    139776.0     13252.0      7     2    0.061    0.085
 35424.0  33384.6   4608.0   4222.4    139776.0     13252.0      7     2    0.061    0.085
 35424.0  33384.6   4608.0   4222.4    139776.0     13252.0      7     2    0.061    0.085
 35424.0  33384.6   4608.0   4222.4    139776.0     13252.0      7     2    0.061    0.085
字段名称表示含义
MC方法区空间容量(单位:字节)
MU方法区使用容量(单位:字节)
CCSC压缩类空间容量(单位:字节)
CCSU压缩类空间使用容量(单位:字节)
OC老年代空间容量(单位:字节)
OU老年代使用容量(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
FGC从应用程序启动到现在,老年代垃圾回收次数
FGCT从应用程序启动到现在,老年代垃圾回收消耗时间(单位:秒)
GCT从应用程序启动到现在,垃圾回收器总消耗时间(单位:秒)

jstat -gcoldcapacity pid interval count 老年代内在空间统计


 jstat  -gcoldcapacity  24410 1000 5
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   175104.0   2796544.0    139776.0    139776.0     7     2    0.061    0.085
   175104.0   2796544.0    139776.0    139776.0     7     2    0.061    0.085
   175104.0   2796544.0    139776.0    139776.0     7     2    0.061    0.085
   175104.0   2796544.0    139776.0    139776.0     7     2    0.061    0.085
   175104.0   2796544.0    139776.0    139776.0     7     2    0.061    0.085
字段名称表示含义
OGCMN老年代垃圾回收最小容量(单位:字节)
OGCMX老年代垃圾回收最大容量(单位:字节)
OGC当前老年代空间容量(单位:字节)
OC老年代容量(单位:字节)
YGC从应用程序启动到现在,年轻代垃圾回收次数
FGC从应用程序启动到现在,老年代垃圾回收次数
FCGT从应用程序启动到现在,老年代垃圾回收消耗时间(单位:秒)
GCT从应用程序启动到现在,垃圾回收器总消耗时间(单位:秒)

jstat -gcutil pid interval count 总垃圾回收统计

jstat  -gcutil  24410 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  56.54   9.48  94.24  91.63      7    0.024     2    0.061    0.085
  0.00   0.00  56.54   9.48  94.24  91.63      7    0.024     2    0.061    0.085
  0.00   0.00  56.54   9.48  94.24  91.63      7    0.024     2    0.061    0.085
  0.00   0.00  56.54   9.48  94.24  91.63      7    0.024     2    0.061    0.085
  0.00   0.00  56.54   9.48  94.24  91.63      7    0.024     2    0.061    0.085
字段名称表示含义
S0幸存区1使用百分比
S1幸存区2使用百分比
E伊甸园使用百分比
O老年区使用百分比
M元数据使用百分比
CCS压缩类使用百分比
YGC年轻代垃圾回收次数
YGCT从应用程序启动到现在,年轻代gc消耗时间(单位:秒)
FGC从应用程序启动到现在,老年代垃圾回收次数
FGCT从应用程序启动到现在,老年代垃圾回收消耗时间(单位:秒)
GCT从应用程序启动到现在,垃圾回收器总消耗时间(单位:秒)

jstat -gcutil pid interval count 总垃圾回收统计

jstat  -printcompilation  24410 1000 5 
Compiled  Size  Type Method
    4096   1264    1 java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask run
    4096   1264    1 java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask run
    4096   1264    1 java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask run
    4096   1264    1 java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask run
    4096   1264    1 java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask run
字段名称表示含义
Compiled最近方法编译的数量
Size最近方法编译字节码的数量
Type最近方法编译类型
Method方法名标识

四、JVM参数设置大全

参数DEMO作用
-Xms或-XX:InitialHeapSize-Xms4096m初始堆内存大小,默认物理内存64/1 XX:InitialHeapSize=100m 缩写 -Xms100m
-Xmx或-XX:MaxHeapSize-Xmx4096m最大堆内存,默认物理内存4/1 -XX:MaxHeapSize=100缩写为-Xmx100m
-Xss 或-XX:ThreadStackSize-Xss1m栈内存大小 设置单个线程栈大小,一般默认512~1024kb,单个线程栈大小跟操作系统和JDK版本都有关系 -XX:ThreadStackSize=100m缩写为-Xss1m
XX:NewSize-XX:NewSize=64m设置New区最小值
-XX:MaxNewSize-XX:MaxNewSize=64m设置New区最大值
-Xmn-Xmn64m设置New区大小,等价于-XX:NewSize=64M 与-XX:MaxNewSize=64M两个参数,此值一旦设置则–XX:NewRatio无效。
-XX:MetaspaceSize-XX:MetaspaceSize=128m元空间大小元空间本质跟永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存。 因此,元空间大小仅受本地内存限制。
-XX:MaxMetaspaceSize-XX:MaxMetaspaceSize=128m最大元空间
-XX:SurvivorRatio–XX:SurvivorRatio=8幸存者比例设置 默认 Eden:S0:S1=8:1:1
-XX:NewRatio–XX:NewRatio=2新生代比例设置 默认Old:New=2:1
-XX:MaxTenuringThreshold-XX:MaxTenuringThreshold=15部分对象会在S0和S1区城中复制水复制去,如此交换15次,最终如果还是存活就存入到老年代
-XX:PretenureSizeThreshold-XX:PretenureSizeThreshold=1048576如果你要创建一个大于这个大小的对象,比如一个超大的数组,或者是别的啥东西,此时就直接把这个大对象放到老年代里去,压根不会经过年轻代,有一个JVM参数,就是“-XX:PretenureSizeThreshold”,可以把它的值设置为字节数,比如“1048576”字节,就是1MB
-verbose:gc-verbose:gc输出每次GC的相关情况
-XX:+PrintGCDetails-XX:+PrintGCDetails输出GC的详细日志
-XX:+PreserveFramePointer-XX:+PreserveFramePointer让perf可以遍历基于帧指针(frame pointer)的堆栈
-XX:+PrintGCDateStamps-XX:+PrintGCDateStamps输出GC的时间戳(以日期的形式,如 2019-11-20T21:53:59.234+0800)
-XX:+PrintHeapAtGC-XX:+PrintHeapAtGC在进行GC的前后打印出堆的信息
-Xloggc-Xloggc:/heap_trace.log输出 GC 日志
-XX:+HeapDumpOnOutOfMemoryError-XX:+HeapDumpOnOutOfMemoryErrorOOM后Dump出内存
-XX:HeapDumpPath-XX:HeapDumpPath=/dump.logOOM后Dump出内存文件
-XX:+UseConcMarkSweepGC-XX:+UseConcMarkSweepGC用户线程和垃圾收集线程同时执行(并不一定是并行,可能交替执行),不需要停顿用户线程,适用对响应时间有要求的场景(例如:用户用餐,餐厅叫出去要叫多个清洁工打扫,边吃边打扫)
-XX:+UseSerialGC-XX:+UseSerialGC为单线程环境设计,且使用一个线程回收垃圾,会暂停所有的用户线程,不适合服务器环境(例如:用户用餐,餐厅叫出去要叫一个清洁工打扫,打扫完再回来吃
-XX:+UseParallelGC-XX:+UseParallelGC多个并行垃圾收集线程工作,此时用户线程是暂停的,适用于科学计算、大数据处理首台处理等若交互环境(例如:用户用餐,餐厅叫出去要叫多个清洁工打扫,打扫完再回来吃)
XX:+UseG1GCXX:+UseG1GCG1垃圾回收器将堆内存分割成不通的区域然后并发的对其进行垃圾回收 java11默认GC回收
-XX:+UseZGC-XX:+UseZGC指定使用ZGC垃圾收集器
XX: InitiatingHeapOccupancyPercentXX: InitiatingHeapOccupancyPercent=45它用于控制触发并发标记周期(Concurrent Marking Cycle)的堆内存占用百分比。默认情况下, 的值通常设置为 45%,意味着当堆内存的使用量达到 45% 时,G1 GC 会开始一个并发标记周期。这个参数的设置对于平衡 GC 的频率和堆内存的使用效率很重要
XX: G1HeapWastePercentXX: G1HeapWastePercent=10允许的浪费堆空间的占比,默认是10%,如果并发标记可国收的空间小于10%,则不会色发MixedGC
XX: MaxGCPauseMillisXX: MaxGCPauseMillis 200ms它用于设置 G1 GC 的目标暂停时间。这个参数告诉 JVM,你希望 G1 GC 在进行垃圾收集时,每次暂停应用程序的最长时间不超过 200 毫秒。
XX: ConcCThreads=nXX: ConcCThreads=3它用于设置 G1 垃圾收集器(G1 GC)在进行并发标记(Concurrent Marking)阶段时使用的线程数
XX: G1MixedGCLiveThresholdPercentXX: G1MixedGCLiveThresholdPercent=65参数用于确定何时启动混合垃圾收集(Mixed GC)默认为 65%,表示当老年代中存活的对象占用的空间达到或超过老年代总容量的 65% 时,G1 GC 会启动混合垃圾收集
-XX: G1MixedGCCountTarget-XX: G1MixedGCCountTarget=8这个参数用于设置在一次混合垃圾收集(Mixed GC)周期中,G1 GC 预期要完成的年轻代(Young Generation)垃圾收集(Young GC)的次数。如果 被设置为 8,那么 G1 GC 会在触发一次混合收集之前,先完成 8 次年轻代垃圾收集。这意味着,G1 GC 会尝试在每次年轻代垃圾收集后,逐步回收老年代中的一部分垃圾,直到达到混合收集的触发条件
XX: G10ldCSetRegionThresholdPercentXX: G10ldCSetRegionThresholdPercent=1这个参数用于控制老年代(Old Generation)中哪些区域(Regions)应该被包含在混合垃圾收集(Mixed GC),该阈值表示老年代中空闲区域(free regions)所占的百分比。当老年代中空闲区域的百分比低于这个阈值时,G1 GC 会触发一个混合收集,以回收不再使用的对象并释放空间。
-XX:PretenureSizeThreshold设置值为字节数,创建超过该大小的对象直接进入老年代。当创建的对象大小超过 指定的值时,JVM 会尝试在老年代中分配这些对象,而不是在新生代中。这有助于减少新生代中频繁发生的垃圾收集对大型对象的影响,因为这些大型对象通常不会在新生代中很快被回收
-XX:+UseAdaptiveSizePolicy当这个参数打开之后,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,自适应大小策略是 G1 GC 的一个特性,它允许 JVM 自动调整堆的大小和 GC 的相关参数,以更好地适应应用程序的工作负载。这意味着 JVM 会尝试预测应用程序的内存需求,并根据此调整堆的大小和其他 GC 参数,从而优化性能和减少 GC 暂停时间。

GC日志分析

我们想查到当前GC的情况可以增加 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:heap_trace.log参数,具体启用命令如下:

java -jar -Xmx512m -Xms512m -Xmn256m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:heap_trace.log demo.jar

这样当JVM每次GC时我们可以在heap_trace.log中看到详细的堆内存变化情况,通过分析GC频次和GC前后堆内存的大小可以判断堆参数设置的是否合理,是否是存在内存泄漏等问题。以下是完整的GC日志:

CommandLine flags: -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=536870912 -XX:MaxNewSize=268435456 -XX:NewSize=268435456 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
2023-12-13T16:24:06.518+0800: 1.891: [GC (Metadata GC Threshold) [PSYoungGen: 157353K->14422K(229376K)] 157353K->14430K(491520K), 0.0362330 secs] [Times: user=0.12 sys=0.04, real=0.04 secs] 
2023-12-13T16:24:06.555+0800: 1.928: [Full GC (Metadata GC Threshold) [PSYoungGen: 14422K->0K(229376K)] [ParOldGen: 8K->13661K(262144K)] 14430K->13661K(491520K), [Metaspace: 19662K->19662K(1067008K)], 0.0188583 secs] [Times: user=0.06 sys=0.01, real=0.02 secs] 
2023-12-13T16:24:08.507+0800: 3.880: [GC (Allocation Failure) [PSYoungGen: 196608K->16114K(229376K)] 210269K->29784K(491520K), 0.0172294 secs] [Times: user=0.06 sys=0.02, real=0.02 secs] 
2023-12-13T16:24:08.879+0800: 4.252: [GC (Metadata GC Threshold) [PSYoungGen: 57056K->9103K(229376K)] 70725K->22780K(491520K), 0.0131290 secs] [Times: user=0.06 sys=0.01, real=0.02 secs] 
2023-12-13T16:24:08.892+0800: 4.265: [Full GC (Metadata GC Threshold) [PSYoungGen: 9103K->0K(229376K)] [ParOldGen: 13677K->13732K(262144K)] 22780K->13732K(491520K), [Metaspace: 33106K->33106K(1079296K)], 0.0487335 secs] [Times: user=0.14 sys=0.01, real=0.05 secs] 
2023-12-13T16:24:10.824+0800: 6.197: [GC (Allocation Failure) [PSYoungGen: 196608K->9830K(229376K)] 210340K->23562K(491520K), 0.0074896 secs] [Times: user=0.03 sys=0.01, real=0.01 secs] 
Heap
 PSYoungGen      total 229376K, used 150468K [0x00000007b0000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 196608K, 71% used [0x00000007b0000000,0x00000007b89576b0,0x00000007bc000000)
  from space 32768K, 30% used [0x00000007be000000,0x00000007be9999f8,0x00000007c0000000)
  to   space 32768K, 0% used [0x00000007bc000000,0x00000007bc000000,0x00000007be000000)
 ParOldGen       total 262144K, used 13732K [0x00000007a0000000, 0x00000007b0000000, 0x00000007b0000000)
  object space 262144K, 5% used [0x00000007a0000000,0x00000007a0d69130,0x00000007b0000000)
 Metaspace       used 50909K, capacity 53917K, committed 54056K, reserved 1095680K
  class space    used 6363K, capacity 6907K, committed 6960K, reserved 1048576K

接下来我们详细介绍GC日志中每一个值的含义:

YongGC

image.png

[GC (Allocation Failure) [PSYoungGen: 2038K->488K(2560K)] 2038K->736K(9728K), 0.0017218 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

FullGC

image.png

[Full GC (Metadata GC Threshold) [PSYoungGen: 55350K->0K(2024960K)] [ParOldGen: 47926K->83327K(2097152K)] 103276K->83327K(4122112K), [Metaspace: 94440K->94408K(1136640K)], 0.2731513 secs] [Times: user=0.86 sys=0.02, real=0.28 secs]

五、总结

本文首页介绍JVM内存结构,其次详细介绍如何使用jstat命令查看JVM内存使用情况,然后列举了JVM常用参数的作用及使用方法,最后通过实际项目分析了GC日志各参数的含义。在实战中能配置出合理的JVM参数主要有以下几点:

  1. 熟悉JVM堆内存结构及GC的过程
  2. 熟悉jstat命令的使用或者其它分析工具,能查看JVM堆内当前的使用情况
  3. 熟悉GC日志的分析,通过分析GC日志可以看出GC频次及GC前后堆内变化情况,从而调整JVM参数
  4. 熟悉JVM各参数的含义,在GC频次过高时能正常的配置JVM参数及时调整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙App语法/结构/注意

注意 默认情况下,应用只能访问有限的系统资源。其他资源权限处理https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/accesstoken-overview-0000001544703857-V3 .1、权限申请使用流程 https://developer.harmonyos.com/cn/docs/documentatio…

【REST2SQL】12 REST2SQL增加Token生成和验证

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

poetry库:依赖管理和打包工具

这个工具是在群里看见别人说好用的,所以了解一下。 1.poetry初始 官网:https://python-poetry.org/ 项目仓库:https://github.com/python-poetry 或 https://github.com/python-poetry/poetry 教程:https://python-poetry.org/…

Day01-项目介绍及初始化-登录页面(test)

1.人力资源项目介绍 1.1 项目架构和解决方案 1.2 课程安排 1.3 课程具备能力 1.4 课程地址 vue-element-admin文档地址:链接演示地址: 链接人力资源项目演示地址: 链接 2. 拉取项目基础代码 拉取命令 $ git clone https://github.com/P…

河北专升本(C语言编程题)

一:基础算法原理 1. 冒泡排序 原理:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例,第一轮比较后,所有数中最大的…

【设计】基于web的会员管理系统

1、引言 设计结课作业,课程设计无处下手,网页要求的总数量太多?没有合适的模板?数据库,java,python,vue,html作业复杂工程量过大?毕设毫无头绪等等一系列问题。你想要解决的问题&am…

云计算项目九:K8S安装

K8S安装 Kube-master安装 按照如下配置准备云主机 防火墙相关配置:禁用selinux,禁用swap,且在firewalld-*。上传kubernetes.zip 到跳板机 配置yum仓库(跳板机) 跳板机主机配置k8s软件源服务端 [rootjs ~]# yum -y…

仿射变换下的点位纠偏

点位偏差一直是一个很头疼的问题,但是由于摄像头和实际环境的局限性,我们不得不面对这个问题。对此,使用判别的方式进行一个仿射变换,是一种非常有效的方式,下图中图1是基准图,图2是目标图,图3是…

使用CSS制作动态的环形图/饼图

使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样&#xff0c;去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…

GIS之深度学习08:安装GPU环境下的pytorch

环境&#xff1a; cuda&#xff1a;12.1.1 cudnn&#xff1a;12.x pytorch&#xff1a;2.2.0 torchvision&#xff1a;0.17.0 Python&#xff1a;3.8 操作系统&#xff1a;win &#xff08;本文安装一半才发现pytorch与cuda未对应&#xff0c;重新安装了cuda后才开始的&a…

时间服务器

目录 软件介绍 软件安装 准备工作 设置当前时区 修改chronyd配置文件 设置允许哪个客户端可以访问该服务器 设置本地服务器时间为第10层级 时钟层&#xff1a; 实例:配置时间服务器客户端服务端 Serves Client 配置环境&#xff1a; systemctl命令 lsof 命令 语法 选项 lsof输…

JL15-80/11电流继电器 过电流瞬时动作 电磁式结构 80A 一开一闭

JL15电流继电器 系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15…

mac本地启动sentinel

启动Sentinel控制台 1&#xff09;下载sentinel控制台jar包 https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar 2&#xff09;启动sentinel控制台 使用如下命令启动控制台&#xff1a; java -Dserver.port8080 -Dcsp.sentinel.d…

[清爽快捷] Ubuntu上多个版本的cuda切换

做到真正的一行代码搞定&#xff0c;只需要修改对应软链接&#xff0c;就可以轻松实现快捷切换cuda 查看已安装的cuda版本有哪些 一般如果我们都是使用默认位置安装cuda的话&#xff0c;那么其安装路径都是/usr/local。如果要查看该目录下已经安装有哪些版本的cuda&#xff0c…

腾讯面经学习笔记

&#x1f496; 前言 &#x1f469;‍&#x1f3eb; 参考地址 &#x1f496; 操作系统 1. 进程和线程的区别 本质区别 进程是操作系统资源分配的基本单位线程是任务调度和执行的基本单位 开销方面 每个进程都有独立的代码和数据空间&#xff08;程序上下文&#xff09;&#…

git使用教程14-Pycharm版本控制与分支管理

一、版本控制 1、版本控制介绍 &#xff08;1&#xff09;Version Control System 版本控制系统&#xff0c;简称VCS。 &#xff08;2&#xff09;版本控制系统分类&#xff1a; 集中式版本控制工具&#xff1a;SVN 分布式版本控制工具&#xff1a;Git 2、Pycharm 支持的版本…

二分应用的小坑———折半查找

啊!啊!啊!啊!啊!!! 太久没有写代码了 虽热很久没有写代码和博客了&#xff0c;但是功底还是在的 今天打算写一点数据结构的排序部分一点一点落实下来&#xff0c;但是 写着写着卡壳了&#xff0c;以下是没有debug的代码 #include <iostream> #include<bits/stdc.h&g…

PyTorch2.0 环境搭建详细步骤(Nvidia显卡)

Step 1 、查看显卡驱动版本 Step2、下载CUDA 11.7 或者11.8&#xff08;我自己用的这个&#xff09;也行,稍后我会贴出来版本匹配对应表 https://developer.nvidia.com/cuda-toolkit-archive Step3、下载CUDNN cuDNN 9.0.0 Downloads | NVIDIA Developer Step4、安装anconda&…

开源模型应用落地-工具使用篇-Spring AI(七)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

HCIA-HarmonyOS设备开发认证V2.0-习题2

目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题&#xff1a; - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器&#xff0c;是通用串行数据总线&#xff0c;…