java进程占用CPU过高常见的两种情况及分析定位

java进程爆cpu的快速定位

1、背景

在程序开发的过程中,难免遇到进程占用cpu过高(现网居多、开发环境)的情况,现网出现这种情况就需要及时的能定位到问题,快速解决,否则就导致系统不可用,用户投诉等多种一系列的问题。

2、java进程占用CPU过高常见的两种情况:
  • 代码中有死循环或者接近死循环的操作
  • 快速创建大量临时变量,导致频繁触发gc回收
3、在windows中的定位方法

如图所示:
在这里插入图片描述
用jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线程分别占用的cpu。
在这里插入图片描述

在这里插入图片描述

所以在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就行了。

3、定位步骤:

3.1、找到java进程对应的pid。

找pid的方法是:打开任务管理器,然后点击 “查看” 菜单,然后点击 “选择列”,把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。
(也可以用第三步中提到的工具直接查看),在win10详细信息里面直接可以看到pid值。
在这里插入图片描述
在这里插入图片描述

3.2.然后把java进程导出快照。直接运行命令。

在这里插入图片描述

找到导出的文件打开d:/jstack182880.stack文件。
在这里插入图片描述

3.3、在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,这里用的是微软提供的 Process Explorer v15.3

下载地址:点击这里下载

下载完后解压运行

找到cpu占用高的线程,双击显示如图,或者右键点击需要查看的进程—properties
在这里插入图片描述

3.4.然后选择 Threads 选项卡,找到占用cpu的线程的tid,比如我这里是 224664 的线程

这里我们可以发现有多个线程占用7%左右,导致cpu占用较高
在这里插入图片描述

3.5.把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。
3.6.在 d:/jstack182880.stack文件中查找 36d98

在这里插入图片描述

找到相关代码,定位出问题所在。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、在linux中的定位方法

4.1.找到CPU占用高的进程号 如:使用top命令查看(可以使用其它方法,只要找到对应的进程号即可)

在这里插入图片描述

注:图中第一列PID为进程号;

4.2、根据进程号找到CPU占用高的线程

如:使用命令top -H -p (其中要换成第一步找到的进程号)
在这里插入图片描述

注:图中第一列PID此时为线程号;

4.3.导出java进程执行堆栈,并找到对应的线程

使用jstack > jstack_xxx.txt (其中要换成第一步找到的进程号)
从第二步中的PID中找出一个CPU占用高的线程号,把它转成16进制,比如3261转成CBD
从导出的堆栈信息里找到nid为cbd的线程堆栈
在这里插入图片描述

4.4:从堆栈里找到对应的代码执行类和方法

若代码为业务代码,则需要具体分析代码,找出代码中死循环或接近死循环的地方,并修正;定位结束;
在这里插入图片描述

若堆栈信息为gc线程(类似下图),则需要进行下一步

4.5:dump出java进程的堆对象使用情况

使用jmap -histo > jmap_xxx.txt
在这里插入图片描述

找出量比较大的、且跟业务有关的对象,找到这些对象创建的地方进行分析;一般需要持续创建大量的对象,使得内存不够用时,才会频繁触发gc进行回收,gc回收时jvm有停顿,CPU也占用很高。

线程之间的切换,是很耗费性能的,所以带来CPU飙升.
新生代设置过小,也会频繁触发gc。有大对象始终根节点路径可达,无法释放,jvm在疯狂的Full GC。

  • 12
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
如果Java进程CPU占用率较,可能有多种原因,以下是一些常见的排除步骤: 1. 确认Java版本:首先,您应该确认Java版本是否与应用程序或框架的要求相符。Java版本过低或过高可能导致CPU占用过高。 2. 确认应用程序是否有异常行为:检查应用程序的日志文件和监视控制台输出,以查找异常行为,如无限循环、内存泄漏、线程阻塞等。这些异常行为可能导致CPU占用过高。 3. 分析堆栈信息:通过分析Java堆栈信息,可以确定哪些线程正在运行以及正在执行哪些代码。您可以使用Java虚拟机自带的工具,如jstack和jmap,来获取和分析堆栈信息。 4. 监视系统资源:您可以使用操作系统自带的工具,如top(Linux)和Task Manager(Windows),来监视系统资源的使用情况。如果CPU使用率过高,您可以检查哪些进程正在使用大量CPU资源。 5. 调整Java虚拟机参数:通过调整Java虚拟机参数,可以优化应用程序的性能。例如,您可以调整垃圾收集器的参数,以减少垃圾回收时间和频率。您可以使用Java虚拟机自带的工具,如jstat和jconsole,来监视和调整Java虚拟机参数。 6. 升级硬件:如果CPU占用过高且无法通过优化Java虚拟机参数来解决,您可以考虑升级硬件,如添加更多的CPU或内存。 以上是一些常见的排除步骤,您可以根据具体情况选择相应的方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

powerfuler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值