美文网首页
java CPU 使用率过高的分析

java CPU 使用率过高的分析

作者: yesyourhighness | 来源:发表于2019-04-04 10:20 被阅读0次

    1. 先找到Java的进程号

    Linux下:

    用top命令查看所有进程,可以明显看到java的,因为cpu占用率很高被排在前面。比如 2019-04-04 10-05-04屏幕截图.png

    windows 下:
    打开任务管理器,然后点击“查看”菜单,然后点击“选择列”,把pid勾上,然后就可以在任务管理器里面看到所有进程的pid了

    2. 做dump (可选)

    jdk自带的jstack工具可以查看jiava的线程信息,可以实时查看,也可以导出来。如果实时查看不方便可以先dump。
    jstack 命令使用提示:
    Usage:
    jstack [-l] <pid>
    (to connect to running process)
    jstack -F [-m] [-l] <pid>
    (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
    (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
    (to connect to a remote debug server)

    Options:
    -F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m to print both java and native frames (mixed mode)
    -l long listing. Prints additional information about locks
    -h or -help to print this help message

    3. 找到里面是哪个线程占用率最高

    Linux下:
    用 top -H -p <pid> 查看该进程所有线程信息,找到占用率最高的那个

    Windows下:
    除了使用jvisualvm或者带上top-thread插件的jconsole之外,可以用Windows自己提供的三方工具—— Process Explorer v15.3

    4. 找到里面是哪个线程占用率最高

    得到占用率最高的线程ID后,要把它转成16进制
    Linux下:
    printf "%x\n" <pid>

    Windows下:
    自带的计算器可以提供该功能

    5. 分析dump查找问题代码片

    可以用 jstack <pid> | grep -A <tid> 来实时获取内存中该线程代码片,这里<tid>是第3步中得到的16进制的id
    也可以在第2步中导出的dump里面查找第3步中得到的线程id的十六进制而找到代码片。

    6. 更简单的办法

    DK自带工具jvisualvm和jconsole是非常强大的。其中jvisualvm原声支持实时查看线程CPU使用情况。
    启动jvisualvm,并查看目标java进程信息,然后选择Sampler -> CPU -> Thread CPU Time
    如图:


    2019-04-04 10-19-46屏幕截图.png

    相关文章

      网友评论

          本文标题:java CPU 使用率过高的分析

          本文链接:https://www.haomeiwen.com/subject/wvzxiqtx.html