记java项目cpu 内存过高分析

公司内部全部是java项目,有时项目所在机器负载过高,为了方便分析相关堆栈信息,编写脚本直接打印结果,定位到问题代码

#!/bin/bash
###Author:kane.zhu
###Time:2017-08-22
###Function:print java stack information for troubleshooting
TOMCAT_ID_1=`ps -ef |grep [t]omcat |awk '{print $2}'|head -n 1`
#TOMCAT_ID_2=`ps -ef |grep [t]omcat |awk '{print $2}'|head 2`
CPU_THREAD=`ps -mp $TOMCAT_ID_1 -o THREAD,tid,time |head -n 15|sort -hr |sed -n 1,7p|awk '{print $2,$8}'`
THREAD=`ps -mp $TOMCAT_ID_1 -o THREAD,tid,time |head -n 15|sort -hr |sed -n 3p|awk '{print $8}'`
THREAD_JINZHI=`printf  "%x\n" $THREAD`
echo "线程ID为$THREAD十六进制的表示为`printf “%x\n” $THREAD`"


echo  "next  we will make choice if the question is memory ,u can  continue, or not"
###使用jstat -gcutil命令查看进程的内存情况
jstat -gcutil $TOMCAT_ID_1 2000 10
function AVE() {
 jstat -gcutil $TOMCAT_ID_1  2000 10 |sed -n 2,11p|awk '{sum+=$i} END {print  sum/NR}'

}
###Eden 
i=3
EDEN_PER=`AVE`
#echo $EDEN_PER
###OLD_PER
i=4
OLD_PER=`AVE`
####FGC-count
i=9
FULLGC_count=`AVE`

#####计算每次FULLGC所占用的时间
i=10
FGCT=`AVE`
####FULLGC_TIME shell本身不支持浮点数运算 需要借助bc来完成 这里注意
FULLGC_TIME=$(echo "scale=5; $FGCT / $FULLGC_count" |bc)
echo $FULLGC_TIME
echo -e "从输出信息可以看出: \n Eden区内存占用百分比:$EDEN_PER \n old区内存占用百分比:$OLD_PER \n FULL GC的次数 :$FULLGC_count \n 平均每次FULLGC耗时:$FULL_GC_TIME \n  根据以上信息得出你的结论"


####现在开始打印相关的问题线程堆栈信息
echo "we will monitor and print stack about tomcat"

jstack $TOMCAT_ID_1 |grep $THREAD_JINZHI -A 30 >> stack_thread.out
sleep 5
cat stack_thread.out


###############  redis 环境内核参数修改  防止OOM killer导致集群挂掉
#!/bin/bash

for redis_pid in ${pgrep -r "redis-server"}
do 
  echo -17 > /proc/${redis_pid}/oom_adj
done







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值