问题描述:
生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。
问题分析:
1,程序属于CPU密集型,和开发沟通过,排除此类情况。
2,程序代码有问题,出现死循环,可能性极大。
问题解决:
1,开发那边无法排查代码某个模块有问题,从日志上也无法分析得出。
2,记得原来通过strace跟踪的方法解决了一台PHP服务器CPU占用高的问题,但是通过这种方法无效,经过google搜索,发现可以通过下面的方法进行解决,那就尝试下吧。
解决过程:
1,根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。
2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
[root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn
显示结果如下:
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 10.5 19 - - - - 3626 00:12:48
root 10.1 19 - - - - 3593 00:12:16
找到了耗时最高的线程3626,占用CPU时间有12分钟了!
将需要的线程ID转换为16进制格式:
[root@localhost logs]# printf "%x\n" 3626
e18
最后打印线程的堆栈信息:
[root@localhost logs]# jstack 2633 |grep e18 -A 30
将输出的信息发给开发部进行确认,这样就能找出有问题的代码。
通过最近几天的监控,CPU已经安静下来了。
具体产生的原因
1.并发情况下 static变量线程不安全发生 多线程同时操作statci变量 该变量是hashmap是非线性安全的在这种情况下 hashmap put的时候进行resize会产生闭环链路 死循环
见http://coolshell.cn/articles/9606.html分析
解决方案:
1.在需要共享的代码块加同步锁 synchronized 同时使用ConcurrentHashMap代替HashMap
分享到:
相关推荐
Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发
基于Qt的多线程并发服务器 incomingConnection(qintptr socketDescriptor)检测
代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!
WEB API 多线程并发测试工具; WEB API 多线程并发测试工具
多线程并发编程在Netty中的应用分析
Tesseract OCR多线程并发识别案例----只演示多线程并发识别,此工具不关注识别正确率,可通过训练tessdata来获得更高的识别正确率。
并发服务器-多线程服务器详解
Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程
linux下的多线程并发机制分析,是linux课程设计的作品。
该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...
模拟IPC,注册接收sip信令消息,模拟发送视频数据,多线程支持多路并发
java多线程并发的在新窗口
在开发过程中自己编写的多线程并发程序组件源代码共享给大家,里面有测试的例子,提供给大家学习,希望大家多提宝贵意见~
实现多线程的并发执行,能演示操作系统的时间转轮调度算法对多线程程序执行的影响效果,能控制一个或多个线程的执行情况。
Linux下基于socket多线程并发通信的实现,论文,pdf文档
JVM优化 并发调试和JDK8新特性,并发调试和JDK8新特性
多线程并发从,学习笔记,代码+注释,从线程创建开始到多线程并发,相关锁以及一些设计模式等
JDK5中的多线程并发库.doc 描述了JDK多线程的并发
Linux下基于socket多线程并发通信的实现.pdf
多线程,高并发