Linux Shell定期使用 jcmd导出日志、堆栈、内存分析实现Java 应用监控

Shell脚本定期使用 jcmd 对目标 Java 应用进行监控、诊断数据导出,并带有日志输出。用于定时采样、OOM分析、死锁排查等场景。

功能

  1. 自动获取 Java 进程 ID;

  2. 每次执行记录:

    • 当前时间;
    • 堆信息 (GC.heap_info);
    • 类实例直方图 (GC.class_histogram);
    • 线程堆栈 (Thread.print);
    • 导出 heap dump;
  3. 每次写入带时间戳的日志文件中。


Shell 脚本

jcmd_monitor.sh

#!/bin/bash

# ===== 配置项 =====
APP_NAME="MyApp"   # 可为主类、jar名关键字、完整名称等
DUMP_DIR="/tmp/jcmd_dumps"             # 输出目录
INTERVAL=60                            # 间隔秒数
MAX_DUMPS=10                           # 最多保留多少轮快照

# ===== 初始化目录 =====
mkdir -p "$DUMP_DIR"

echo "[INFO] Starting jcmd monitoring for: $APP_NAME"
echo "[INFO] Dump folder: $DUMP_DIR"

while true; do
    TIMESTAMP=$(date "+%Y%m%d-%H%M%S")
    LOG_PREFIX="$DUMP_DIR/jcmd-$TIMESTAMP"
    
    # 查找 Java 进程 PID(可根据 APP_NAME 修改)
    PID=$(jcmd | grep "$APP_NAME" | awk '{print $1}')
    
    if [[ -z "$PID" ]]; then
        echo "[WARN] No Java process found for keyword: $APP_NAME"
        sleep "$INTERVAL"
        continue
    fi

    echo "[INFO] Running jcmd diagnostics on PID: $PID at $TIMESTAMP"

    # 输出 JVM 堆信息
    jcmd "$PID" GC.heap_info > "$LOG_PREFIX.heap_info.log" 2>&1
    
    # 输出类直方图
    jcmd "$PID" GC.class_histogram > "$LOG_PREFIX.class_histogram.log" 2>&1
    
    # 输出线程栈
    jcmd "$PID" Thread.print > "$LOG_PREFIX.thread_dump.log" 2>&1

    # 可选:导出 heap dump(如不需要可注释掉)
    jcmd "$PID" GC.heap_dump "$LOG_PREFIX.heap.hprof" > "$LOG_PREFIX.heap_dump.log" 2>&1

    echo "[INFO] Dump complete: $LOG_PREFIX"

    # 自动清理最旧的文件
    ls -1t "$DUMP_DIR"/* | tail -n +$((MAX_DUMPS * 5 + 1)) | xargs -r rm -f

    sleep "$INTERVAL"
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值