世はJDK6の時代ですが、JDK5の環境でデッドロックなんぞが起こってしまったので急遽ダンプを取るなどした。jmapやjstackのオプションがJDK6から便利になりすぎてて少し泣いた。
あと、会社のPCのHDDが死にそうで、こっちはマジにビビリながら作業した。
dump.sh
#!/bin/bash JDK_HOME=$ORACLE_HOME/jdk OC4J_INSTANCE=$1 OC4J_STDOUT=$ORACLE_HOME/opmn/logs/$OC4J_INSTANCE~$OC4J_INSTANCE~default_group~1.log # parametor check. if [ "$OC4J_INSTANCE" = "" ]; then echo "usage: $0 <oc4j_instance_name>" exit fi # java process check. PID=`$JDK_HOME/bin/jps -v | grep $OC4J_INSTANCE | awk '{print $1}'` if [ "$?" != "0" -o "$PID" = "" ]; then echo "instance '$OC4J_INSTANCE' is not found." exit fi DUMP_HOME=/tmp/dump/$PID mkdir -p $DUMP_HOME # Info dump. echo "Info dump." $JDK_HOME/bin/jinfo $PID > $DUMP_HOME/jinfo.log # Heap dump(JDK5). echo "Heap dump." $JDK_HOME/bin/jmap -heap:format=b $PID mv heap.bin $DUMP_HOME/ # Heap dump(JDK6). # $JDK_HOME/bin/jmap -dump:file=heap.bin $PID # Threads dump(JDK5). echo "Threads dump." tail -n 0 -f $OC4J_STDOUT > $DUMP_HOME/threads.log & sleep 1 kill -3 $PID sleep 15 kill -9 `jobs -l | awk '{print $2}'` # Threads dump(JDK6). # $JDK_HOME/bin/jstack -l $PID > $DUMP_HOME/threads.log
JDK6に移行しても使えるようにJDK6的なやり方をコメントに書いているけど、試していないので動くかは不明(その環境がJDK6に移行したら試す)。あと、Oracle Application Serverのことしか考えていない。
heap.binが決め打ちなので移動させたり、JDK5のjstackはロック情報を出すオプションが無いので怪しいスレッドダンプの取り方をしてたり、とにかくなんだかカオスです。