有这样一台web服务器,上边安装着nginx(做反向代理),另外安装了一个tomcat7.0.23,jdk1.7
该tomcat上运行了一个webapp,主要提供了两个服务,一个是短信,另一个是定时器,定时获取邮件表中未发送的邮件,每分钟检查一次
该webapp部署在别的服务器上,cpu,内存工作都正常,唯独部署在这台服务器上,cpu高的吓人;
下图是我用visualVM抓的图,请帮忙分析一下
把问题服务器上的环境原封不动的复制到另外一台机器上,工作十分正常
另外,该服务2个月前已经稳定运行了1年半,tomcat都没重启过,就是最近突然出现这个问题,cpu 接近100%
起初考虑是否该tomcat的某个端口收到了攻击,我将tomcat的端口折腾了一边,问题依旧
请大家帮忙分析一下
碰到这种问题,一般会做一个简单的jsp页面,列举虚拟机中所有的线程(显示线程名称、对应类名以及运行状态),然后监控看看是否有一些线程是一直处于RUNNABLE状态(除了一些Tomcat自身的服务线程除外)
继续深入来看的话,在接收到请求的时候把当前线程名和对应的URL地址打印出来。
二者结合来看,就能看到是用户在访问哪个URL而导致的线程一直在运行。
列举所有线程的jsp页面:
<html>
<head>
<title>Threads in ldcstudy.com</title>
<style>
body {font-size:8pt;}
ol {line-height:18px;}
</style>
</head>
<body>
<strong>java.io.tmpdir:</strong>
<ul>
<li><%=System.getProperty("java.io.tmpdir")%></li>
</ul>
<br/>
<strong>Memory:</strong>
<ol>
<li>freeMemory=<%=Runtime.getRuntime().freeMemory()/(1024*1024)%>M</li>
<li>totalMemory=<%=Runtime.getRuntime().totalMemory()/(1024*1024)%>M</li>
<li>maxMemory=<%=Runtime.getRuntime().maxMemory()/(1024*1024)%>M</li>
</ol>
<br/>
<strong>Thread:</strong>
<ol>
<%for(Thread t : list_threads()){%>
<li><%=t.getName()%>(<b><%=t.getState()%></b>) : <%=t.getClass().getName()%></li>
<%}%>
</ol>
<%!
public static java.util.List<Thread> list_threads(){
int tc = Thread.activeCount();
Thread[] ts = new Thread[tc];
Thread.enumerate(ts);
return java.util.Arrays.asList(ts);
}
%>
</body>
</html>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。