java - 不需要的 block 线程导致 Tomcat 失败

标签 java multithreading tomcat

我有一个在 Tomcat 7.x 上运行的 Web 应用程序 一旦服务器负载过大,应用程序就会停止运行。 在查看线程转储时,我观察到发生了以下堆栈跟踪(这与我的应用程序代码无关)。可能原因的任何指针

"ajp-bio-26642-exec-181" daemon prio=10 tid=0x0ae2a800 nid=0x3508 waiting for monitor entry [0x3a5ec000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:354)
    - waiting to lock <0x7a7095b8> (a org.apache.jasper.servlet.JspServletWrapper)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    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)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    - locked <0xe40ab0d0> (a org.apache.tomcat.util.net.SocketWrapper)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

最佳答案

看到你在评论中发布的日志,我怀疑你处理数据库连接的方式有问题?
由于没有发布实际代码,只需搜索其中一些问题的答案可能会引导您找到正确的方向,

  1. 查看您的连接设置。
  2. 你使用自动提交吗?
  3. Oracle 中 opencursors 的最大数量是多少?
  4. 你如何处理连接。您是否有连接池,或者是否在需要时创建连接并即时关闭它们?
  5. 正在使用哪个 Oracle 驱动程序? More info
  6. 您使用 UCP 吗?如果是,请查看 this link

有关如何分析线程转储的更多信息 what-to-look-for-in-java-thread-dumpshow-analyze-java-thread-dumps

关于java - 不需要的 block 线程导致 Tomcat 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19542433/

相关文章:

session - Coldfusion 10跨域HTTPS session 问题

java - HttpServlet 中间类未按预期初始化

eclipse - 定义新服务器时,只有 Tomcat v8.0 未显示在 Eclipse 中

java - 相似字符串比较失败

java - java如何测试条件

java - 如何在多线程Java应用程序中实现同步

java - ResponseListener 在 snmp4j 中的工作原理

java - apt-get install -y openjdk-8-jdk 失败

java - 关键字是如何开发的?

c - Pthread程序计数器