欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

分析java进程cpu使用率过高的shell脚本,javashell,分析java进程cpu使

来源: javaer 分享于  点击 18886 次 点评:147

分析java进程cpu使用率过高的shell脚本,javashell,分析java进程cpu使


分析java进程cpu使用率过高的shell脚本

#!/bin/bash# @Function# Find out the highest cpu consumed threads of java, and print the stack of these threads.## @Usage#   $ ./show-busy-java-threads.sh## @author Jerry LeePROG=`basename $0`usage() {    cat <<EOFUsage: ${PROG} [OPTION]...Find out the highest cpu consumed threads of java, and print the stack of these threads.Example: ${PROG} -c 10Options:    -p, --pid       find out the highest cpu consumed threads from the specifed java process,                    default from all java process.    -c, --count     set the thread count to show, default is 5    -h, --help      display this help and exitEOF    exit $1}ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`[ $? -ne 0 ] && usage 1eval set -- "${ARGS}"while true; do    case "$1" in    -c|--count)        count="$2"        shift 2        ;;    -p|--pid)        pid="$2"        shift 2        ;;    -h|--help)        usage        ;;    --)        shift        break        ;;    esacdonecount=${count:-5}redEcho() {    [ -c /dev/stdout ] && {        # if stdout is console, turn on color output.        echo -ne "\033[1;31m"        echo -n "$@"        echo -e "\033[0m"    } || echo "$@"}# Check the existence of jstack command!if ! which jstack &> /dev/null; then    [ -z "$JAVA_HOME" ] && {        redEcho "Error: jstack not found on PATH!"        exit 1    }    ! [ -f "$JAVA_HOME/bin/jstack" ] && {        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"        exit 1    }    ! [ -x "$JAVA_HOME/bin/jstack" ] && {        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"        exit 1    }    export PATH="$JAVA_HOME/bin:$PATH"fiuuid=`date +%s`_${RANDOM}_$$cleanupWhenExit() {    rm /tmp/${uuid}_* &> /dev/null}trap "cleanupWhenExit" EXITprintStackOfThread() {    while read threadLine ; do        pid=`echo ${threadLine} | awk '{print $1}'`        threadId=`echo ${threadLine} | awk '{print $2}'`        threadId0x=`printf %x ${threadId}`        user=`echo ${threadLine} | awk '{print $3}'`        pcpu=`echo ${threadLine} | awk '{print $5}'`        jstackFile=/tmp/${uuid}_${pid}        [ ! -f "${jstackFile}" ] && {            jstack ${pid} > ${jstackFile} || {                redEcho "Fail to jstack java process ${pid}!"                rm ${jstackFile}                continue            }        }        redEcho "Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"        sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}    done}ps -Leo pid,lwp,user,comm,pcpu --no-headers | {    [ -z "${pid}" ] &&    awk '$4=="java"{print $0}' ||    awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'} | sort -k5 -r -n | head --lines "${count}" | printStackOfThread
相关栏目:

用户点评