zoukankan      html  css  js  c++  java
  • JVM内存问题定位

    一、查看机器资源使用状态:

    使用top命令,内存占用较高的那个PID对应的进程一般就是JVM了

    二、查看Swap状态:

    使用free -m 命令,一般内存占用过高会导致swap占用也偏高,看看swap占用比例,如何超过50%,就比较危险了

    三、确认swap占用:

    cat /proc/$PID/smaps | grep 'Swap' | sort

    四、找出该进程内最耗费CPU的线程,可以使用

    1)ps -Lfp pid
    2)ps -mp pid -o THREAD, tid, time
    3)top -Hp pid
    用第三个,输出如下:


    TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为XX的线程,用

    printf "%x
    " $XX

    得到XX的十六进制值为xx,下面会用到。

    OK,下一步终于轮到jstack上场了,它用来输出进程XX的堆栈信息,然后根据线程ID的十六进制值grep,如下:

    root@ubuntu:/# jstack $XX | grep $xx
     

    如果报错:
    sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp,请参考:http://zhangshaoxiong.blog.51cto.com/4408282/1310166


    附,查看swap占用的脚本:
    #!/bin/bash
    # 获取swap使用情况
    function getSwap() {
    SUM=0
    OVERALL=0
    for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"`
    do
    PID=`echo ${DIR} | cut -d / -f 3`
    PROGNAME=`ps -p ${PID} -o comm --no-headers`
    for SWAP in `grep Swap ${DIR}/smaps 2>/dev/null| awk '{ print $2 }'`
    do
    let SUM=$SUM+$SWAP
    done
    if [[ ${SUM} -gt 0 ]]; then
    echo "$PID $SUM $PROGNAME"
    fi

    let OVERALL=$OVERALL+$SUM
    SUM=0
    done
    echo "swap总使用量: $OVERALL "
    }

    function sorted(){
    echo "PID Swap_used Program"
    getSwap
    echo "$?"| sort -n -t ' ' -k 2r -k 1 | awk '{ print $1 $2 $3}'
    }

    sorted
    
    

      

     
  • 相关阅读:
    大文件上传
    zabbix接口
    Vue 在不同的环境使用不同的接口地址
    Vue发布流程
    RabbitMQ集群一些使用细节
    Watcher 系统整体流程图
    监控系统各个模块部署
    deepin安装node和npm最新
    google安装json插件
    数据库访问性能优化 Oracle
  • 原文地址:https://www.cnblogs.com/yepei/p/7079821.html
Copyright © 2011-2022 走看看