点击蓝色“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 说句题外话,想和老赵聊聊面试相关的经验、技术可以加我微信,但是坑位有限哦 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 猜你喜欢 31 32 33 34 35 36 37 38 39 40 41 42 43 1、高效率!让java8的Stream对集合操作飞起来 44 45 46 47 2、工作发狂:Mybatis 中$和#千万不要乱用! 48 49 50 51 3、不是我吹,Lambda 这个坑你真的不知道 52 53 54 55 4、小王,当Redis内存被打满了,会发生什么? 56 57 58 59 5、SpringBoot这样优化,让你的项目飞起来! 60 61 62 63 6、细说 Java 主流日志工具库 64 65 66 67 7、后端开发都应该掌握的Redis基础 68 69 70 71 8、我为什么不再推荐 RxJava 72 73 74 75 76 77 78 79 80 81 82 83 强烈推荐一位大佬的公众号
好文章,我在看❤️
本文分享自微信公众号 - java版web项目(java_project)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。