首先要明白为什么要进行JVM调优?
- 对于高QPS(每秒查询率,一台服务器能够响应的查询请求的次数)的项目来说
- 其将会在堆内存中高度频繁地创建对象,将会触发较为频繁的GC
- 可以使用
jstat
命令查看GC的情况 jstat -gcutil pid 1000
每隔1秒打印一次GC统计信息
- 首先要找到java进程的pid
- 通过内置的jps命令去找到pid
- jps -p :仅输出 pid
- jps -m : 输出传递给main方法的参数
- jps -l : 输出主类的完整报名
- jps -v :输出传递给JVM的参数
- jstat命令执行结果
jstat -gc pid
code | 解释 | 示例数据(单位:字节) |
S0C | 年轻代中第一个存活区的大小 | 1024.0 |
S1C | 年轻代中第二个存活区的大小 | 1536.0 |
S0U | 第一个存活区已用空间 | 0.0 |
S1U | 第二个存活区已用空间 | 1024.6 |
EC | Eden区大小 | 48640.0 |
EU | 年轻代已经使用Eden区的空间 | 6530.7 |
OC | 老年代大小 | 330240.0 |
OU | 老年代已经使用空间 | 150405.0 |
PC | 永久代大小 | 177496.0 |
PU | 永久代已经使用空间 | 171133.4 |
YGC | 从application run到采样时ygc的次数 | 269 |
YGCT | 从application run到采样时ygc所用的时间 | (单位:s)7.096 |
FGC | 从application run到采样时full gc的次数 | 5 |
FGCT | 从application run到采样时full gc所用时间 | (单位:s)1.017 |
GCT | 从application run到采样整个GC用时 | (单位:s)8.114 |
YGC单次GC平均耗时
- YGCT/YGC = 0.0263 大约26ms
FGC单次GC平均耗时
- FGCT/FGC = 0.2034 大约200ms
整体GC平均耗时
- GCT/(YGC+FGC)
如何打印GC log
标签:采样,run,打印,application,XX,GC,JVM,调休,小记 From: https://blog.51cto.com/u_16079703/6428796打印GC log需要在 JVM 启动参数中添加以下参数 -XX:+PrintGCDateStamps :打印GC发生时间戳 -XX:+PrintTenuringDistribution :打印GC发生时的分代信息 -XX:+PrintGCApplicationStoppedTime :打印GC停顿时长 -XX:+PrintGCApplicationConcurrentTime :打印GC间隔的服务运行时长 -XX:+PrintGCDetails :打印GC详情,包括GC前内存等 -XlogGC:../xxx/xxx :指定 GC log 的路径
可以使用 GCeasy 工具分析GC log https://GCeasy.io