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

简介

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

排查步骤

1. 查看服务PID

jps

JAVA 别再问为什么CPU占用率100%_第1张图片
服务kg_deep_tuple_extraction.jar是我们的服务,PID为31660

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

top -p 31660

JAVA 别再问为什么CPU占用率100%_第2张图片
CPU占用一直是100%多

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

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

JAVA 别再问为什么CPU占用率100%_第3张图片
该命令已经按照cpu占用排序,问题线程基本就是第一个,可以看到tid为31765的线程,cpu占用95.9%,是占用最高的线程了,耗时09:17,那就是这个线程出了毛病,我们接着往下看。

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

printf “%x\n” tid

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

5.打印线程的堆栈信息

jstack pid |grep tid -A 30

JAVA 别再问为什么CPU占用率100%_第4张图片
可以看到是哪一行代码出了问题,如图是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:可以查看某个进程的当前线程栈运行情况

你可能感兴趣的:(java)