一次系统测试时执行top命令发现cpu竟接近100%!
找到进程id 31260,执行jstack 31260 > cpu31260.log,将堆栈信息dump到log文件中。
通过top -p 31260 -H命令找到占用cpu最多的线程,为31328
打开cpu31260log文件,查找到线程31328的相关信息:
发现是程序代码问题,即该类第37行,原来是一不小心把循环里面的阻塞方法写错了。
while (true) {
Task task = taskQueue.poll();
if (task != null) {
……..
}
…….
}
taskQueue是LinkedBlockingQueue类,程序的本意是在阻塞队列为空时阻塞等待,但poll()方法在获取不到元素时会直接返回null,所以poll()方法应该改成take(),这样就不会有毫无意义的死循环发生。
这里再补充一个小知识点,有时在mvn clean install 的时候经常卡在下载metadata文件,检查更新的地方,导致打包速度变慢。
这和maven仓库的访问速度有关,如果不想频繁检验,可对仓库作一些设置:
<repository>
<id>centralmaven</id>
<url>http://central.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
关键是updatePolicy节点,这是maven的更新策略,有多个选项:always表示总是,never表示从不,daily(默认)表示每天,interval:X 表示X分钟。
国内oschina的maven镜像站已经关闭了,知道有个阿里的镜像,速度还可以,但感觉其中的库没有官方的全面:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
不知道国内还有没有其他不错的镜像站,知道的朋友可以留言推荐下。