1024程序员节这天,我故意写了个死循环~
导致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%的情况了!希望对大家有所帮助!
欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
dubbo专题-深入浅出zookeeper订阅原理
进行了解析.知道dubbo会对zookeeper的信息进行一个本地的文件缓存.如果你只是简单的回答出这个本地的文件缓存,可能面试官会点到为止,但是如果你按照我那样从源码角度分析,甚至连缓存到哪个磁盘文件都一清二楚,那么面试官必然会根据这个问题深入问下去.既然要深入问下去,那他会从哪个角度问呢? 比如公司新来了妹子,老司机们在下班的时候总会套路一下,问她们你男朋友怎么不接你下班啊.这个时候妹子的回答往往也就两个,一个是我没有男朋友啊,另一个是他忙啊(这说明她有男朋友).从这里例子就可以很容易看出,你的发言,对对方的回答我们是能一定程度预判的.再比如,我一直自称肥朝,假如你发现我其实没有你想的那么肥,按照正常的思维你就会问我,既然你没这么肥为什么要叫肥朝.这再次说明了,对方的提问,我们是可预判的. 同理可得,你回答了会缓存本地文件,并且连目录都一清二楚,那他如果照着这个问题深入问下去,他可能会问什么呢?可能会问,既然是缓存,那么自然会存在和实时数据不同步,那么他是什么时候去更新这个缓存?鉴于你前面回答得这么透彻,可能还会加上一句,他这个更新的过程是怎么样的?能画图给我讲一下吗? 当然看到这...
- 下一篇
Java多线程编程 — 锁优化
阅读目录 一、尽量不要锁住方法 二、缩小同步代码块,只锁数据 三、锁中尽量不要再包含锁 四、将锁私有化,在内部管理锁 五、进行适当的锁分解 正文 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众所周知的事情。然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程。 如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗基本可以忽略。因此,规范加锁的操作,优化锁的使用方法,避免不必要的线程竞争,不仅可以提高程序性能,也能避免不规范加锁可能造成线程死锁问题,提高程序健壮性。下面阐述几种锁优化的思路。 一、尽量不要锁住方法 在普通成员函数上加锁时,线程获得的是该方法所在对象的对象锁。此时整个对象都会被锁住。这也意味着,如果这个对象提供的多个同步方法是针对不同业务的,那么由于整个对象被锁住,一个业务业务在处理时,其他不相关的业务线程也必须wait。下面的例子展示了这种情况: LockMethod类包含两个同步方法,分别在两种业务处理中被调用: BUSSA是线程类,用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装