点击蓝色“java版web项目”关注我哟
加个“星标”,优质文章,第一时间送达
上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家
下一篇:这200G的Java实战资料是我师傅当年教我的第二招
作者:翟志军
导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是其中一个没踩过的。人生似乎有些不完整。
所以,我做了一个很重要的决定:在程序中写一个死循环。看看会发生什么事情。
当然,不是在生产环境。😜 我搭建了一个实验环境来做实验。只是这个实验环境不仅可以用于这个死循环实验。以下是这个环境的结构图:
还是老样子,使用Vagrant + Virtualbox + Ansible自动化搭环境。
我们会写一个简单的Spring MVC 应用,然后其中一个接口里会有死循环代码:
以下是我自己尝试找出这个死循环的过程。
一、使用top,查看是哪个进程的问题
我请求一次:
http://192.168.88.10:9898/web/loop
然后,我打开新窗口,又请求一次
这里,我好奇CPU没有到200%。一直在120%和130%之间。P.S. 我一定是某个知识点不牢固,要不,不会有这个疑问。
二、堆空间
因为不涉及JVM堆空间问题,执行 jstat -gcutil 32593 1s 没看出什么问题。32593为Java进程ID,1s指1秒抽样一次。
三、栈
堆没问题,就看看是哪个线程占用得高。
列出java进程的线程,top -H -p <java 进程pid>
将jvm的栈dump下来 jstack -l <其中一个线程PID> >> stack.log,这里我选3596。
在日志中,找到相应的线程,我们需要从栈日志中找到相应的线程,但由于栈日志中使用的16进制,但是top中的PID又是10进制。所以,需要手工将10进制的PID转成16进制。3596的16进制转是0xe0c
四、小结
从这个解决的方式过程中,我们已经可以看出来一种基本的处理CPU 100%的情况了!希望对大家有所帮助!
说句题外话,想和老赵聊聊面试相关的经验、技术可以加我微信,但是坑位有限哦
猜你喜欢
1、高效率!让java8的Stream对集合操作飞起来
2、工作发狂:Mybatis 中$和#千万不要乱用!
3、不是我吹,Lambda 这个坑你真的不知道
4、小王,当Redis内存被打满了,会发生什么?
5、SpringBoot这样优化,让你的项目飞起来!
6、细说 Java 主流日志工具库
7、后端开发都应该掌握的Redis基础
8、我为什么不再推荐 RxJava
强烈推荐一位大佬的公众号
好文章,我在看❤️
本文分享自微信公众号 - java版web项目(java_project)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。