1

我面临 tomcat7 的高 CPU 利用率问题。使用JDK7开发的Web应用程序部署在tomcat服务器上。此 Web 应用程序联系在不同实例上运行的 MySQL 服务器以获取 CRUD 功能。

一周一次tomcat的CPU占用率异常高。为了分析它,我进行了线程转储,发现是一些阻塞的线程。

大多数被阻塞的线程都有以下堆栈跟踪,

ajp-bio-8009-exec-20604 - priority:10 - threadId:0x0000000001aac000 - nativeId:0x4143 - state:BLOCKED stackTrace: java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category。 callAppenders(Category.java:204) - 等待在 org.apache.log4j.Category.forcedLog(Category.java:391) 在 org.apache.log4j.Category 锁定 <0x000000008bf42fc8> (一个 org.apache.log4j.Logger) .log(Category.java:838) 在 com.myUtil.filter.XSSFilter.doFilter(XSSFilter.java:37) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache。 catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.apache.catalina.valves.AccessLogValve 的 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) .invoke(AccessLogValve.java:936) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org. org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor 的 apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)。 run(JioEndpoint.java:310) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器: - <0x00000000db84e190>(一个 java.util. concurrent.ThreadPoolExecutor$Worker)

还有另一个与 JDBC 连接相关的堆栈跟踪,

ajp-bio-8009-exec-20585 - priority:10 - threadId:0x000000000190f000 - nativeId:0x40d6 - state:BLOCKED stackTrace: java.lang.Thread.State: BLOCKED (on object monitor) at com.mysql.jdbc.JDBC4Connection。 isValid(JDBC4Connection.java:93) - 等待在 com.myUtil.dbconnection.DBAccessObject.IsConnected(DBAccessObject.java:751) 在 com.myUtil.dbhandler.MyDBHandler 处锁定 <0x000000008bdf9890> (a com.mysql.jdbc.JDBC4Connection) .InitOrGetConnection(MyDBHandler.java:119) 在 com.myUtil.util.ProcessRequest.myPost(ProcessRequest.java:1539) 在 com.myUtil.dbhandler.MyDBHandler.GetNotification(MyDBHandler.java:8585) 在 com.myUtil.util。 ProcessRequest.doPost(ProcessRequest.java:104) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 在 org.apache.catalina .core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at com.myUtil.filter.XSSFilter.doFilter(XSSFilter.java:58) at org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve .java:222) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 的 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)。 Valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.ajp .AjpProcessor.process(AjpProcessor.java:200) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java :310) - 在 java.util.concurrent.ThreadPoolExecutor$Worker 的 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper)。在 java.lang.Thread.run(Thread.java:744) 处运行 (ThreadPoolExecutor.java:615) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)936)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)在 org.apache.coyote.ajp.AjpProcessor .process(AjpProcessor.java:200) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) ) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)936)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)在 org.apache.coyote.ajp.AjpProcessor .process(AjpProcessor.java:200) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) ) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor. java:200) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 锁定 <0x00000000db7c38f8 >(org.apache.tomcat.util.net.SocketWrapper)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615 ) 在 java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor. java:200) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 锁定 <0x00000000db7c38f8 >(org.apache.tomcat.util.net.SocketWrapper)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615 ) 在 java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) at org .apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 锁定 <0x00000000db7c38f8> (一个 org.apache .tomcat.util.net.SocketWrapper) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang。 Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) at org .apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 锁定 <0x00000000db7c38f8> (一个 org.apache .tomcat.util.net.SocketWrapper) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang。 Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 处的 .process(AbstractProtocol.java:589) - 锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper ) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java: 744)锁定的可拥有同步器:-<0x00000000db7c3940>(java.util.concurrent.ThreadPoolExecutor$Worker)118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 处的 .process(AbstractProtocol.java:589) - 锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper ) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java: 744)锁定的可拥有同步器:-<0x00000000db7c3940>(java.util.concurrent.ThreadPoolExecutor$Worker)coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run( JioEndpoint.java:310) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor 锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper) $Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run( JioEndpoint.java:310) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor 锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper) $Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$Worker)JioEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 处锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$工人)JioEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 处锁定 <0x00000000db7c38f8> (一个 org.apache.tomcat.util.net.SocketWrapper) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) 锁定的可拥有同步器:- <0x00000000db7c3940> (a java.util.concurrent.ThreadPoolExecutor$工人)0x00000000db7c3940>(一个 java.util.concurrent.ThreadPoolExecutor$Worker)0x00000000db7c3940>(一个 java.util.concurrent.ThreadPoolExecutor$Worker)

我检查了 MySQL 服务器的状态。但是那里的一切(连接数/线程数)都很正常。

此应用程序在过去 4 年中运行良好。仅在过去的 3 个月里,我才面临这个问题。并且没有对服务器代码进行任何更改。每次发生此问题时,我都必须重新启动服务器。

如何找到此问题的根本原因并永久解决此问题?

4

0 回答 0