Tomcat使用Spring管理对象出现HashMap死循环的问题
2015-11-02 10:55
253 查看
上周发了一个线上的项目,发现程序运行一段时间之后,cpu的load average经常飙到8以上,后来添加了几台服务器,问题任然没有得到解决,周末对程序进行了一下分析终于发现了问题所在,特此记录一下。
(1)发现问题:
首先到服务器上用top命令找到是tomcat线程cpu等资源使用率过高,记下这个线程的pid假设为123456。
然后用ps mp 123456 -o THREAD,tid > b.out打印出这个进程下所有的线程,输出到b.out文件中,找出占用cpu最多的线程,假设是23456,34567两个。
然后用sudo jstack -F 123456 > a.out打印出tomcat进程的线程栈,存到a.out中。然后在a.out文件中找到23456和34567两个线程的栈信息,栈信息中就是你程序中消耗cpu过高的地方。
下面是b.out文件的信息,从信息中可以看到是21376和21377占用cpu资源过高。
然后再到a.out中找到21376的函数栈查看,找到消耗资源过高的函数。
(2)问题原因:
首先是因为spring管理的对象,默认是单例模式的,tomcat对没一个请求都会起一个线程响应,这样就容易造成共享变量的问题。我程序中有一个HashMap是一个类的成员变量,所以就涉及到多线程安全的问题,至于共享的hashmap为什么会造成程序死循环的问题,可以参考下面的链接:http://ifeve.com/hashmap-infinite-loop/
(1)发现问题:
首先到服务器上用top命令找到是tomcat线程cpu等资源使用率过高,记下这个线程的pid假设为123456。
然后用ps mp 123456 -o THREAD,tid > b.out打印出这个进程下所有的线程,输出到b.out文件中,找出占用cpu最多的线程,假设是23456,34567两个。
然后用sudo jstack -F 123456 > a.out打印出tomcat进程的线程栈,存到a.out中。然后在a.out文件中找到23456和34567两个线程的栈信息,栈信息中就是你程序中消耗cpu过高的地方。
下面是b.out文件的信息,从信息中可以看到是21376和21377占用cpu资源过高。
然后再到a.out中找到21376的函数栈查看,找到消耗资源过高的函数。
(2)问题原因:
首先是因为spring管理的对象,默认是单例模式的,tomcat对没一个请求都会起一个线程响应,这样就容易造成共享变量的问题。我程序中有一个HashMap是一个类的成员变量,所以就涉及到多线程安全的问题,至于共享的hashmap为什么会造成程序死循环的问题,可以参考下面的链接:http://ifeve.com/hashmap-infinite-loop/
相关文章推荐
- 下载tomcat插件最新的网址
- Tomcat中文乱码问题的原理和解决方法
- tomcat
- 深入浅析TomCat Session管理分析
- 普通用户启动tomcat
- tomcat部署记录tip
- Tomcat数据库连接池的配置方法总结
- Tomcat集群和Session共享的配置方法
- Tomcat start Exception及解决办法
- Tomcat安装和配置
- Tomcat源码分析——Session管理分析(上)
- 《how tomcat works》翻译开篇
- 在tomcat上发布一个javaweb项目
- Apache和Apache Tomcat的区别
- Linux下配置jdk+tomcat+mysql+oa
- Tomcat端口占用相关的问题
- Tomcat正常启动,可以访问其主页,却不能访问webapp中的项目的jsp文件
- tomcat中给server.xml加入<Context>元素
- 在一台服务器上配置多个Tomcat的方法
- 自动重启tomcat服务器