本文已参与「新人创作礼」活动,一起开启掘金创作之路。
为了找到运行服务的JVM最佳运行状态,或者服务JVM性能监控和排查都可以通过监控JVM指标来完成。
需要获得以下指标: 时间 服务名 进程号 启动时间(秒) YGC(年轻代回收次数) YGCT(年轻代回收执行耗时) FGC(老年代回收次数) FGCT(老年代回收执行耗时)
按时间(每1/10分钟)和服务为维度,统计JVM垃圾回收情况,
获取指标
获得启动时间
ps -eo pid,etime,cmd |grep java
获得YGC、YGCT、FGCT、FGCT
jstat -gcutil PID
获取指标脚本(仅供参考)
#!/bin/bash
Time=`date "+%Y-%m-%d %H:%M:%S"`
SERVICEPID_STARTTIME=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}'`
if [[ `ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | egrep "-" | wc -l` == "1" ]];then
Da=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | awk -F '-' '{print $1}'`
D=$(($Da*24*60*60))
else
D="0"
fi
if [[ `ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | egrep "-" | wc -l` == "1" ]];then
Ta=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | awk -F ':' '{print $(NF-2)}' | awk -F '-' '{print $2}'`
T=$(($Ta*60*60))
elif [[ `ps -eo pid,etime | egrep $PID |awk -F ' ' '{print $NF}' | awk -F "" '{for(i=1;i<=NF;++i) if($i==":") ++sum}END{print sum}'` == "1" ]];then
T="0"
elif [[ `ps -eo pid,etime | egrep $PID |awk -F ' ' '{print $NF}' | awk -F "" '{for(i=1;i<=NF;++i) if($i==":") ++sum}END{print sum}'` == "2" ]];then
Ta=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | awk -F ':' '{print $(NF-2)}'`
T=$(($Ta*60*60))
fi
sleep 2
if [[ `ps -eo pid,etime | egrep $PID |awk -F ' ' '{print $NF}' | awk -F "" '{for(i=1;i<=NF;++i) if($i==":") ++sum}END{print sum}'` == "0" ]];then
M="0"
else
Ma=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | awk -F ':' '{print $(NF-1)}'`
M=$(($M*60))
fi
S=`ps -eo pid,etime | egrep "$PID" | awk -F ' ' '{print $NF}' | awk -F ':' '{print $NF}'`
# 计算启动时间(秒)
SUM=$(($D + $T + $M + $S))
YGC=`jstat -gcutil $PID | awk -F ' ' '{print $(NF-4)}' | egrep -v "YGC"`
YGCT=`jstat -gcutil $PID | awk -F ' ' '{print $(NF-3)}' | egrep -v "YGCT"`
FGC=`jstat -gcutil $PID | awk -F ' ' '{print $(NF-2)}' | egrep -v "FGC"`
FGCT=`jstat -gcutil $PID | awk -F ' ' '{print $(NF-1)}' | egrep -v "FGCT"`
GCT=`jstat -gcutil $PID | awk -F ' ' '{print $NF}' | egrep -v "GCT"`
printf "$Time,$SERVICE_NAME,$PID,$SUM,$YGC,$YGCT,$FGC,$FGCT,$GCT"
其他性能分析
查看heap信息
jstat -gc PID 5s 3
查看heap信息
jmap -heap 545592
Heap dump
jmap -dump:format=b,file=path PID
统计对象的数量
jmap -histo PID