开发者社区> 问答> 正文

tomcat占用cpu这么高的原因

落地花开啦 2016-05-27 15:39:17 1254

有这样一台web服务器,上边安装着nginx(做反向代理),另外安装了一个tomcat7.0.23,jdk1.7
该tomcat上运行了一个webapp,主要提供了两个服务,一个是短信,另一个是定时器,定时获取邮件表中未发送的邮件,每分钟检查一次
该webapp部署在别的服务器上,cpu,内存工作都正常,唯独部署在这台服务器上,cpu高的吓人;
下图是我用visualVM抓的图,请帮忙分析一下
1
把问题服务器上的环境原封不动的复制到另外一台机器上,工作十分正常
另外,该服务2个月前已经稳定运行了1年半,tomcat都没重启过,就是最近突然出现这个问题,cpu 接近100%
起初考虑是否该tomcat的某个端口收到了攻击,我将tomcat的端口折腾了一边,问题依旧
请大家帮忙分析一下

应用服务中间件 nginx
分享到
取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:18:03

    碰到这种问题,一般会做一个简单的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>
    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程