【问题标题】:linux top command CPU usage doesn't add up / how to view Java threads usage in realtime?linux top 命令 CPU 使用率不加起来/如何实时查看 Java 线程使用情况?
【发布时间】:2014-01-03 07:59:54
【问题描述】:

当我运行top -p <pid> 命令时,我可以看到该进程正在使用大约 10% 的 cpu,但是当我按“H”列出线程时,每个线程的 cpu 使用率显示为 0%。

为什么会这样?我想实时查看 Java 线程 CPU 使用情况,top 不是最好的方法吗?

截图 (按 H 之前)

按H后-

【问题讨论】:

    标签: java linux multithreading cpu-usage


    【解决方案1】:

    如果您更喜欢使用类似脚本的工具,还有jvmtop 可以为您提供每个线程的 cpu 使用率。

    下面的示例输出。

    【讨论】:

      【解决方案2】:

      如果您使用的是 Sun Java JDK Distribution,则可以使用 jconsole。如果我没记错的话,它是从 Java 1.5 开始作为捆绑包的一部分内置的。您可以实时查看 JVM 的线程、加载的类、内存使用情况和 CPU 使用情况。

      【讨论】:

      • 先试试visualvm,它会显示每个线程的使用情况,更像GC等。jconsole类似。
      【解决方案3】:

      您可以使用VisualVMjconsole

      【讨论】:

        【解决方案4】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-19
          • 1970-01-01
          • 2010-10-07
          • 2015-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-13
          相关资源
          最近更新 更多