JAVA 别再问为什么CPU占用率100%

简介

在下是刚毕业的小萌新,现在在一家股票资讯公司做Java开发,身在nlp小组,自然要接触很多模型,我的任务就是tensoflow模型的工程部署,开发完成之后,发布到服务器上发现CPU占用一直是100%,糟了,多半是死循环的感觉。

排查步骤

1. 查看服务PID

jps

在这里插入图片描述
服务kg_deep_tuple_extraction.jar是我们的服务,PID为31660

2. 使用top -p查看资源情况

top -p 31660

在这里插入图片描述
CPU占用一直是100%多

3.使用ps -mp pid -o THREAD,tid,time查看线程

ps -mp 31600 -o THREAD,tid,time |sort -k2r

在这里插入图片描述
该命令已经按照cpu占用排序,问题线程基本就是第一个,可以看到tid为31765的线程,cpu占用95.9%,是占用最高的线程了,耗时09:17,那就是这个线程出了毛病,我们接着往下看。

4.将需要的线程ID转换为16进制格式

printf “%x\n” tid

在这里插入图片描述
得到转换后的tid为7c15

5.打印线程的堆栈信息

jstack pid |grep tid -A 30

在这里插入图片描述
可以看到是哪一行代码出了问题,如图是BatchQueueThread.java:60,线程状态时Runnable,我们去代码里找到这段代码。

@Override
public void run() {
	long start = System.currentTimeMillis();
	while(true) {
		long now = System.currentTimeMillis();
		if (queue.size() < batchMaxSize && now -start < sleepTime) {
			continue;
		}
		try{
			List<E> inputs = poll();
			if (inputs.isEmpty()) {
				contitue;
			}
			start = now;
			results.putAll(baseBatchService.predictBatch(inputs));
		} catch (Exception e) {
			LOG.error("predict batch error : {}", ExceptionUtils.getStackTrace(e));
		}
	}
}

ooo~原来是忘记了Thread.sleep(1),加上就解决了。

总结

最后,总结下排查CPU100%用到的命令:

1、top:查看CPU等资源的占用情况

2、ps:进程状态监控,可以查看进程以及进程中线程的用情况

3、jstack:JDK的命令,可以查看某个进程的当前线程栈运行情况

4、pstack:可以查看某个进程的当前线程栈运行情况

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值