说明
- 产品最近有一些问题,想着能够每隔一段时间抓取一下dump文件.
- 需求 可以定期抓取, 需要注意磁盘空间的使用.
实现方法
- 定时任务使用 crontab 计划任务来做
- 预定义获取jvm dump的命令文件为: /deploy/getjvmdump
crontab -e 打开计划任务 增加如此内容.
5 */1 * * * /deploy/getjvmdump
没个准点的 第五分钟执行一遍命令
脚本内容
export JAVA_HOME=/app/server/runtime/java/x86_64-linux/
export PATH=/app/server/runtime/java/x86_64-linux/bin/:$PATH
if [ ! -d /jvmdump ]; then
mkdir -p /jvmdump
fi
dumptime=`date +%Y%m%d%H%M`
dumpid=`jps |grep caf-boot|awk '{print $1}' |head -n 1`
if [[ ! $dumpid ]]; then
dumpid=`jps |grep PropertiesLauncher|awk '{print $1}' |head -n 1`
fi
# 需要区分正常启动还是优雅启动
echo $dumpid
echo $dumptime
filename=$dumptime"_"$dumpid
echo $filename
jcmd $dumpid GC.heap_dump /jvmdump/$filename.dump
gzip /jvmdump/$filename.dump
cd /jvmdump/
find /jvmdump/*.gz -mtime +1 -exec rm -rf {} \;
# 清理一天之前的dump文件. 注意这个命令要慎用 出问题需要跑路.
获取其他统计信息
export JAVA_HOME=/app/server/runtime/java/x86_64-linux/
export PATH=/app/server/runtime/java/x86_64-linux/bin/:$PATH
if [ ! -d /jvmdump ]; then
mkdir -p /jvmdump
fi
dumptime=`date +%Y%m%d%H%M`
dumpid=`jps |grep caf-boot|awk '{print $1}' |head -n 1`
if [[ ! $dumpid ]]; then
dumpid=`jps |grep PropertiesLauncher|awk '{print $1}' |head -n 1`
fi
# 需要区分正常启动还是优雅启动
echo $dumpid
echo $dumptime
filename=$dumptime"_"$dumpid
echo $filename
jcmd $dumpid VM.uptime >>/jvmdump/trace_$filename.log
jcmd $dumpid VM.flags>>/jvmdump/trace_$filename.log
jcmd $dumpid Thread.print>>/jvmdump/trace_$filename.log
jcmd $dumpid GC.class_histogram >>/jvmdump/trace_$filename.log
jcmd $dumpid GC.heap_info >>/jvmdump/trace_$filename.log
# 抓取信息到指定路径..