【发布时间】:2014-01-03 07:59:54
【问题描述】:
当我运行top -p <pid> 命令时,我可以看到该进程正在使用大约 10% 的 cpu,但是当我按“H”列出线程时,每个线程的 cpu 使用率显示为 0%。
为什么会这样?我想实时查看 Java 线程 CPU 使用情况,top 不是最好的方法吗?
截图 (按 H 之前)
按H后-
【问题讨论】:
标签: java linux multithreading cpu-usage
当我运行top -p <pid> 命令时,我可以看到该进程正在使用大约 10% 的 cpu,但是当我按“H”列出线程时,每个线程的 cpu 使用率显示为 0%。
为什么会这样?我想实时查看 Java 线程 CPU 使用情况,top 不是最好的方法吗?
截图 (按 H 之前)
按H后-
【问题讨论】:
标签: java linux multithreading cpu-usage
如果您更喜欢使用类似脚本的工具,还有jvmtop 可以为您提供每个线程的 cpu 使用率。
下面的示例输出。
【讨论】:
如果您使用的是 Sun Java JDK Distribution,则可以使用 jconsole。如果我没记错的话,它是从 Java 1.5 开始作为捆绑包的一部分内置的。您可以实时查看 JVM 的线程、加载的类、内存使用情况和 CPU 使用情况。
【讨论】:
Java 1.6 及以上版本具有用于监视/调试Java 模块的内置Java 工具。 这是以下示例脚本: ` #/bin/bash
#Initilization of variable
CUREENT_DATE=`date -d "0 day" "+%Y%m%d"` #2012-06-22
CURRENT_MONTH=`date -d "0 month" "+%B%Y"` #June2012
LAST_DATE=`date -d "1 day ago" "+%Y%m%d"` #2012-06-21
BASE_PATH="/home/javaMonitoring"
SCRIPT_LOGS="/home/javaMonitoring/logs"
JAVA_PATH=`echo $JAVA_HOME`
PERM=0
MSG="No Message"
HOSTIP="localhost"
THRESHOLD=80;
if [ ! -d $BASE_PATH ];then
echo " Base Directory not exists![$BASE_PATH]"
exit
fi
cd $BASE_PATH
if [ ! -d $SCRIPT_LOGS ];then
echo " Log Directory note found [$SCRIPT_LOGS]"
mkdir -p $SCRIPT_LOGS
fi
##LOG Directory
if [ ! -d $CUREENT_DATE ];then
echo " Log Directory note found [$CUREENT_DATE]"
mkdir -p $CUREENT_DATE
fi
log_file_path="$SCRIPT_LOGS/${CUREENT_DATE}-"`basename $0 .sh`".log"
echo "############ Script:$log_file_path##################" >$log_file_path
#####Funcations
cd $JAVA_PATH/bin
BOOTSTRAP=`${JAVA_PATH}/bin/jps|grep Bootstrap|cut -d " " -f1`
if [ $? -ne 0 ];then
echo "No Bootstrap PID exists[${JAVA_PATH}/bin/jps|grep Bootstrap]" >>$log_file_path
exit
#If log file not exists
else
if [ ! -f ${BASE_PATH}/${CUREENT_DATE}/gcutil.txt ];then
touch ${BASE_PATH}/${CUREENT_DATE}/gcutil.txt
echo "Timestamp S0 S1 E O P YGC YGCT FGC FGCT GCT" > ${BASE_PATH}/${CUREENT_DATE}/gcutil.txt
fi
./jstat -gcutil -t $BOOTSTRAP|grep -v Timestamp >> ${BASE_PATH}/${CUREENT_DATE}/gcutil.txt
PERM=`jstat -gcutil -t ${BOOTSTRAP} | grep -v Timestamp|awk -F " " '{print $6}'`
#if [ ${PERM} -ge ${THRESHOLD} ];then
if [ $PERM > $THRESHOLD ];then
MSG="MCOM: Alert `date` on ${HOSTIP} Server Current Perm is :: ${PERM}%"
fi
#continue;
fi `
输出保存在 :: ../YYYYMMDD/gcutil.txt
Timestamp S0 S1 E O P YGC YGCT FGC FGCT GCT
16193.4 0.00 59.95 55.13 93.86 89.63 226 26.192 41 48.532 74.724
16196.5 0.00 59.95 55.14 93.86 89.63 226 26.192 41 48.532 74.724
【讨论】: