Out Of My Memory

雨垂れ石を穿つ

【Java】一定間隔でスレッドダンプを取得するシェルスクリプト

事前準備

jps等でスレッドダンプを取得したいjavaプロセスを調べておく。

$ jps
387 Jps
133 Bootstrap

実行コマンド

./thread_dump.sh [対象のpid]

ソース

引数1:スレッドダンプを取得したいjps 引数2:任意。スレッドダンプの取得間隔(デフォルトで5秒)

#!/bin/bash

# スプリプトが存在するディレクトリへ移動する
SCRIPT_DIR=$(cd $(dirname $0); pwd)

# スレッドダンプ格納用フォルダを実行するスクリプトと同じ階層に作成する
if [[ ! -d $SCRIPT_DIR/capture_ThreadDumps ]]; then
  mkdir $SCRIPT_DIR/capture_ThreadDumps
  echo "create ${SCRIPT_DIR}/capture_ThreadDumps folder!"
fi

# 取得間隔の代入
if [ "$2" = "" ]; then
  echo "set interval default:5s"
  interval=5
else
  interval=$2
   echo "set interval :${interval}s"
fi

while true;
do
  jstack $1 > $SCRIPT_DIR/capture_ThreadDumps/thread_dump_$1_`date "+%Y%m%d_%H%M%S"`.log
  echo "DONE thread dump!"
  sleep "${interval}s"
done

スレッドダンプについて

  • AP側で処理が詰まっていないか確認するために取得するもの
  • ボトルネック箇所がAPであると切り分けてから使用するもので、初めから見るようなものではない。
  • visualVMやflight recorderなどのプロファイラでメソッドごとの実行時間が見られるため、取得する場合は限られる。

経験談 1つのスレッドが大量にログを出力しており、他のスレッドのログ出力がblockされ、処理が滞留していた インスタンスを大量に生成する処理を多くのスレッドが行なっており、生成箇所で処理が滞留していた