【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され、処理が滞留していた インスタンスを大量に生成する処理を多くのスレッドが行なっており、生成箇所で処理が滞留していた