1

我有一个在 Tomcat 7.0.23 上运行的网络应用程序(spring/hibernate)。症状是运行几天(通常为 4 到 5 天)后,反应变得非常缓慢。通常在 2 秒内加载的页面需要 30 到 50 秒。重新启动会使响应恢复正常(2 秒)。我之前和之后都进行了线程转储。我看到有问题的线程(需要更长的时间来响应)有一个锁。这是片段。

at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
    at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    - locked <0x0000000799446298> (a
org.apache.tomcat.util.net.SocketWrapper)
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

查看代码后,有一个同步方法,它解释了锁。但是,我想知道锁定是否会减慢速度,那么为什么它没有从新的开始出现,为什么只在运行几天后才出现。想知道在哪里看。有什么线索吗?提前致谢。

4

1 回答 1

0

我建议您使用 jmeter 或 soapui 之类的东西运行基本测试。

慢慢增加负载,看看会发生什么:平均时间是通过屋顶还是只是变慢了一点?您是否遇到错误或仍在运行?

同时,打开 visualvm 并查看您的虚拟机。您可能会遇到内存 pbs、GC 忙于释放未使用的实例或锁定?使用线程转储和堆转储功能更进一步。

我在一个非常旧的应用程序上进行了这样的测试,发现 log4j 1.x 在多线程方面存在很大问题:升级到 log4j 2 -> 问题解决了!

希望这可以帮助。

于 2013-09-19T10:10:17.247 回答