java CPU 使用率过高的分析

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、top(Linux命令) 执行top命令: (查看进程15477的详细情况,下文用到) 系统信息(前五行): ...
    java菜阅读 1,220评论 0 1
  • 进程 操作系统背景知识 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作...
    go以恒阅读 1,040评论 0 2
  •  Thread dumps(线程转储)能帮助我们判断 CPU 峰值、死锁、内存异常、应用反应迟钝、响应时间变长和其...
    SunnyMore阅读 2,902评论 0 3
  • 这是关于故障诊断文章的第二篇,翻译自《How to Analyze Java Thread Dumps》,原文地址...
    LNAmp阅读 3,886评论 1 5
  • 二十的我 是什么样的 就那样吧 没什么特别的 却又和别人不一样 我喜欢文学 爱旅游拍照 朋友就几个 但关系足够好 ...
    默汐阅读 322评论 1 6

友情链接更多精彩内容