如何jstack抓取Java的堆栈信息?

Bash

1 前言

一个问题,一篇文章,一出故事。
笔者生产环境有台Tomcat的服务由于需要分析内存越来越大的原因,于是需要抓取程序堆转储快照。

2 最佳实践

2.1 创建管理脚本

vim ~/scripts/tomcat-jstack.sh

加入如下配置,

#!/bin/bash

setTime=`date +"%Y-%m-%d %H:%M:%S"`
jstackStatusLog=/var/log/tomcat/jstackStatus.log
jastackLog="`dirname "$jstackStatusLog"`/jstack/jstack.$setTime.log"
javaUser="tomcat"
javaHome="/usr/java/jdk1.8.0_65"

if [ ! -d `dirname "$jastackLog"` ]; then
        mkdir -p `dirname "$jastackLog"`
fi

javaPid=`pgrep -u "$javaUser" java`
sudo -u "$javaUser" "$javaHome/bin/jstack" -l "$javaPid" > "$jastackLog"
echo "$setTime" >> "$jstackStatusLog"
IFS=$'\n'
for i in `grep "java.lang.Thread.State:" "$jastackLog" | sort -u | awk -F ':' '{print $2}' | sed 's/^[ \t]*//g'`; do
        echo "$i": `grep "$i" "$jastackLog" | wc -l` >> "$jstackStatusLog"
done
echo >> "$jstackStatusLog"

#find `dirname "$jastackLog"` -type f -ctime -7 -name "jstack.*.log" -exec ls -l {} \;
find `dirname "$jastackLog"` -type f -ctime +7 -name "jstack.*.log" -exec rm -f {} \;

以上主要参数定义如下,
– 核心命令“jstack”通过Tomcat的PID抓取Tomcat的堆栈信息
– 非核心命令“find”找出超过7天的数据并删除,安全我们默认配置显示7天内备份的数据

2.2 创建脚本触发

crontab -e

加入如下配置,

*/5 * * * * sh ~/scripts/tomcat-jstack.sh
没有评论

发表回复

Bash
如何根据条件输出MySQL表Insert行?

1 前言 一个问题,一篇文章,一出故事。 笔者执行NextCloud的维护任务,需要从数据表中删除用 …

Bash
如何函数代替Base Shell的命令别名?

1 前言 一个问题,一篇文章,一出故事。 之前的章节我们使用命令别名来缩写输入的命令,相见如下, 如 …

Bash
如何监视服务并自动通知?

1 前言 一个问题,一篇文章,一出故事。 最近笔者希望通过脚本实现监视服务并在服务异常是使用两种方式 …