如何jmap抓取Java程序堆转储快照?

Bash

1 前言

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

2 最佳实践

2.1 创建管理脚本

vim ~/scripts/tomcat-heap-dump.sh

加入如下配置,

#!/bin/bash

setTime=`date +"%Y-%m-%d %H:%M:%S"`
heapDump="/data/heapDump/heapdump-$setTime.hprof"
javaUser="tomcat"
javaHome="/usr/local/jdk-15.0.2"

javaPid=`"$javaHome/bin/jps" | grep Bootstrap | awk -F ' ' '{print $1}'`

if [ ! -d `dirname "$heapDump"` ]; then
        sudo -u "$javaUser" mkdir -p `dirname "$heapDump"`
fi

sudo -u "$javaUser" "$javaHome/bin/jmap" -dump:format=b,file="$heapDump" "$javaPid"

find `dirname "$heapDump"` -type f -ctime -7 -name "heapdump-*.hprof" -exec ls -l {} \;
#find `dirname "$heapDump"` -type f -ctime +7 -name "heapdump-*.hprof" -exec rm -f {} \;

以上主要参数定义如下,
– 核心命令“jmap”通过Tomcat的PID抓取Tomcat堆转储快照并保存到预设的目录
– 非核心命令“find”找出超过7天的数据并删除,安全我们默认配置显示7天内备份的数据

2.2 创建脚本触发

crontab -e

加入如下配置,

0 0 */ * * sh ~/scripts/tomcat-heap-dump.sh
没有评论

发表回复

Bash
如何Telnet自动登录路由器执行命令?

1 前言 一个问题,一篇文章,一出故事。 最近在笔者需要一个脚本自动从路由读取一些信息,因此整理本章 …

Bash
如何防止Base Shell脚本重复执行?

1 前言 一个问题,一篇文章,一出故事。 笔者最近发现脚本因为重复执行而损耗服务器性能,因此解决此问 …

Bash
如何实现Base Shell的数值百分比计算?

1 前言 一个问题,一篇文章,一出故事。 最近笔者需要通过Base Shell实现一个计算Quota …