Java基础之《JVM性能调优(14)—CPU性能调优》

一、linux cpu使用率100%的性能分析调优

1、问题
现在你接到运营电话说“线上系统很卡”,你马上登陆linux服务器,你会做哪些动作,解决系统卡顿的问题?

2、top命令
在服务器上,我们可以通过top命令查看各个进程的cpu使用情况,它默认是按cpu使用率由高到低排序的。
(用来知道哪一个进程CPU利用率是最高的)比如进程10265

3、top -Hp pid
通过top -Hp PID可以查看该进程下,各个线程的cpu使用情况。
(找到这条线程CPU利用率99%)比如线程10288

4、导出堆栈信息
jstack -l PID > /tmp/log.txt
我们可以把这些堆栈信息打到一个文件里,再回头仔细分析。

5、把log.txt下载到本地分析
所有线程的状态都导出来了。

6、10进制转16进制
我们把占用CPU资源较高的线程pid(本例子是10273),将该pid转成16进制的值。
https://tool.oschina.net/hexconvert
10288转换为2830

7、找到nid=0x2830
可以看到这一条线程,当前的状态和运行的代码。
查找代码,发现bug,修改代码。

二、基于Arthas的CPU性能分析调优

1、Arthas(阿尔萨斯)是什么
Arthas是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了丰富的功能,是排查JVM相关问题的利器。
他能做的一些事情:
1)提供性能看板,包括线程、cpu、内存等信息,并且会定时的刷新。
2)根据各种条件查看线程快照。比如找出cpu占用率最高的n个线程等。
3)查看已加载的类的详细信息,比如这个类从哪个jar包加载的。也可以查看类的方法的信息。
4)dump某个类的字节码到指定目录
5)直接反编译指定的类
6)查看类加载器的一些信息
7)可以让JVM重新加载某个类
8)监控方法的执行,同时可以获取到执行的入参、出参以及抛出的异常
9)追踪方法执行的调用栈,以及各个方法的调用时间

2、下载地址
下载全量包;
https://arthas.aliyun.com/download/latest_version?mirror=aliyun

或者执行命令下载:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

3、启动命令
./as.sh
选择一个java process

4、dashboard
命令格式:dashboard
进入当前系统的实时数据面板,按ctrl + c退出。
这个面板会实时刷新,其中包括线程信息、内存信息、gc信息,还有一些运行时的数据。
另外,当运行在ali-tomcat时,会显示当前tomcat的实时信息,如http请求的qps,rs,错误数,线程池信息等等。

敲入dashboard

可以看到线程、线程的CPU使用率、内存堆、eden区、survivor区、old区等。

5、thread
敲入thread

查看某个id线程堆栈
命令格式:thread [id]
看看id为13的线程在干嘛

6、找出当前阻塞的线程
thread -b

三、系统太卡,如何分析GC频率
CPU不足会导致系统很卡,内存不足也会导致系统很卡。

1、查看gc垃圾总体回收频率
格式:jstat -gc -h10 PID 采样次数

先用jps找出进程号,然后执行采样jstat -gc -h10 27891 1000

2、说明
【survivor区】
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
【eden区】
EC:伊甸园区的大小
EU:伊甸园区的使用大小
【old区】
OC:老年代大小
OU:老年代使用大小
【方法区】
MC:方法区大小
MU:方法区使用大小

【内存压缩,内存不足就会被压缩】
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小

【young gc区】
YGC:从应用程序启动到当前,发生Young GC的次数
YGCT:从应用程序启动到当前,Young GC所用的时间【单位秒】
【full gc区】
FGC:从应用程序启动到当前,发生Full GC的次数
FGCT:从应用程序启动到当前,Full GC所用的时间
GCT:从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

知道为什么系统很卡了吧,因为系统的所有时间都去做STW

2、查看年轻代的gc频率
格式:jstat -gcnew -h10 PID 采样次数
执行采样jstat -gcnew -h10 27891 1000

3、说明
【survivor区】
S0C:年轻代中第一个survivor(幸存区)的容量(字节)
S1C:年轻代中第二个survivor(幸存区)的容量(字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间(字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间(字节)
【这两个不重要】
TT:持有次数限制
MTT:最大持有次数限制
【eden区】
EC:年轻代中Eden(伊甸园)的容量(字节)
EU:年轻代中Eden(伊甸园)目前已使用空间(字节)
【young gc区】
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(秒)

4、查看老年代的gc频率
格式:jstat -gcold -h10 PID 采样次数
执行采样jstat -gcold -h10 27891 1000

5、说明
这个就是查看full gc的情况。

【方法区】
MC:方法区大小
MU:方法区使用大小
【内存压缩】
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
【old区】
OC:old代的容量(字节)
OU:old代目前已使用空间(字节)
【full gc区】
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(full gc)次数
FGCT:从应用程序启动到采样时old代(full gc)gc所用时间(秒)
GCT:从应用程序启动到采样时gc用的总时间(秒)

6、问题之所在
主要看FGC这一行,频率是不是很高

7、多久触发一次full gc是正常的
高频率的full gc是非常不正常的。
从以往的经验来说,一般几个小时一次,算正常。
也就是说full gc的频率是按小时为单位的。

四、Full GC频率太高,如何分析,如何解决

1、方法一
发现高频率full gc时,dump下堆文件
jmap -dump:live,format=b,file=/tmp/01.hprof PID

2、方法二
设置jvm参数,出现OOM时,生成dump堆文件
java -jar -Xms512m -Xmx512m app.jar -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/01.hprof

3、压缩文件下载
tar -zcvf 01.tar.gz 01.hprof

4、用JProfiler打开分析
一般看一下Classes里有没有,再看一下Biggest Objects里有没有,占用内存特别多的。
 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值