JVM调优
一.CPU过高
1.查看jvm的进程ID,可以通过jps或者ps
jps -lvm
ps -ef | grep Test
2.找出该进程内最耗费CPU的线程
top -Hp 2444
linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程
3.将线程ID转化为16进制
printf “%x\n” 线程ID
4.通过jstack输出进程(2444)的堆栈信息,然后根据16进制的线程ID过滤结果
jstack 2444 >stack.txt
grep 99b stack.txt
二、查看GC情况
命令:jstat -gcutil pid 250 4
参数列表及含义如下:
参数 | 参数含义 |
---|---|
S0C | 年轻代中第一个 survivor 的容量 |
S1C | 年轻代中第二个 survivor 的容量 |
S0U | 年轻代中第一个 survivor 目前已使用空间 |
S1U | 年轻代中第二个 survivor 目前已使用空间 |
EC | 年轻代中 Eden 的容量 |
EU | 年轻代中 Eden 目前已使用空间 |
OC | 老年代的容量 |
OU | 老年代目前已使用空间 |
MC | 元空间 metaspace 的容量 |
MU | 元空间 metaspace 目前已使用空间 |
YGC | 从应用程序启动到采样时 年轻代 中 gc 次数 |
YGCT | 从应用程序启动到采样时 年轻代 中 gc 所用时间 |
FGC | 从应用程序启动到采样时 老年代 中 gc 次数 |
FGCT | 从应用程序启动到采样时 老年代 中 gc 所用时间 |
GCT | 从应用程序启动到采样时 gc 用的 总时间 |
>jstat -gcutil 8615 1000 100
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
209664.0 209664.0 6838.6 0.0 1677824.0 1580232.0 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 6838.6 0.0 1677824.0 1592533.1 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 6838.6 0.0 1677824.0 1628600.9 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 6838.6 0.0 1677824.0 1648193.8 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 6838.6 0.0 1677824.0 1657000.4 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 6838.6 0.0 1677824.0 1673865.0 2097152.0 737763.4 � � 4270 97.841 12 1.262 99.103
209664.0 209664.0 0.0 5037.6 1677824.0 29050.1 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 33389.5 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 54870.6 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 69660.5 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 84031.2 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 98908.8 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 104836.5 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 129248.2 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 132179.7 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
209664.0 209664.0 0.0 5037.6 1677824.0 150897.4 2097152.0 737938.3 � � 4271 97.856 12 1.262 99.118
三、分析GC日志
命令:jmap -dump:live, format=b, file=heap.hprof pid
将内存使用情况导出到文件中,常见的 Young GC、Full GC 日志含义如下:
命令:more -f service_gc_20190924103424.log
- Young GC
> more -f service_gc_20190924103424.log
2019-12-04T13:13:43.880+0800: 1440.321: [GC (Allocation Failure) 2019-12-04T13:13:43.880+0800: 1440.321: [ParNew: 1750912K->78330K(1887488K), 0.0725838 secs] 1803625K->136321K(3984640K), 0.0728766 secs] [Times: user=0.20 sys=0.00, real=0.08 secs]
2019-12-04T13:15:43.666+0800: 1560.107: [GC (Allocation Failure) 2019-12-04T13:15:43.666+0800: 1560.107: [ParNew: 1756154K->52722K(1887488K), 0.0650971 secs] 1814145K->124148K(3984640K), 0.0654118 secs] [Times: user=0.15 sys=0.00, real=0.07 secs]
2019-12-04T13:17:37.126+0800: 1673.567: [GC (Allocation Failure) 2019-12-04T13:17:37.126+0800: 1673.567: [ParNew: 1730546K->39545K(1887488K), 0.0468796 secs] 1801972K->120284K(3984640K), 0.0471756 secs] [Times: user=0.12 sys=0.01, real=0.05 secs]
2019-12-04T13:19:38.723+0800: 1795.164: [GC (Allocation Failure) 2019-12-04T13:19:38.723+0800: 1795.164: [ParNew: 1717369K->16986K(1887488K), 0.0589880 secs] 1798108K->110399K(3984640K), 0.0592766 secs] [Times: user=0.11 sys=0.01, real=0.06 secs]
2019-12-04T13:21:34.312+0800: 1910.753: [GC (Allocation Failure) 2019-12-04T13:21:34.312+0800: 1910.753: [ParNew: 1694810K->15206K(1887488K), 0.0269209 secs] 1788223K->109852K(3984640K), 0.0272546 secs] [Times: user=0.08 sys=0.00, real=0.03 secs]
2019-12-04T13:23:29.880+0800: 2026.321: [GC (Allocation Failure) 2019-12-04T13:23:29.881+0800: 2026.321: [ParNew: 1693030K->10283K(1887488K), 0.0246338 secs] 1787676K->107662K(3984640K), 0.0249202 secs] [Times: user=0.07 sys=0.00, real=0.02 secs]
- Full GC
免费的 GC 日志图形分析工具推荐如下:
- GCViewer:下载 jar 包直接运行
- gceasy:Web 工具,上传 GC 日志在线使用
- MAT:Eclipse的MAT工具