我在Tomcat 6上运行基于Java的多用户Web应用程序。
出于某种原因,1天后整个应用程序变得非常慢。
"top"
表示CPU处于120%(由tomcat进程引起),尽管在线用户不多,所以我假设存在某种无限循环(或类似问题)。< / p>
在我的本地系统上,我无法重现该问题。 我也无法找出导致问题的部分(哪个类/方法)。
调试此问题的最佳方法是什么?
答案 0 :(得分:8)
使用分析器查看哪些方法运行最多(大多数呼叫或大多数时间)。 jvisualvm是免费的,是Java JDK的一部分。
如果GUI不是一个选项(如评论中所述),请尝试使用hprof(http://java.sun.com/developer/technicalArticles/Programming/HPROF.html)或任何命令行分析器(有很多他们)。
但您不需要在同一台计算机上运行探查器GUI。您可以在计算机上运行它并连接到远程VM。
答案 1 :(得分:3)
我不知道tomcat本身(我们使用的是集成了tomcat的JBoss) - 但第一步是创建一个线程转储,看看哪个线程在做什么。
如果您的应用程序在Java 6上运行,您可以使用jConsole连接到JVM并创建线程转储。请注意,可能仍需要启用对JVM的远程访问。
答案 2 :(得分:0)
曾经发生在我身上,这是我打算处理它的计划:
答案 3 :(得分:0)
有很多分析器知道哪个线程消耗更多的jvm时间,我们也可以从工具本身那里得到建议。下面是一些分析器
<强>的JProfiler, tptpprofiler 强>
答案 4 :(得分:0)
如果您可以停止应用程序服务器:
使用java代理检测应用程序(有关详细信息,请参阅[1])。有些产品使用这种技术为您提供J2EE性能指标(平均响应时间,每个时间间隔的响应,并发调用,aso。)开箱即用(Wily Introscope)因此,您可以快速识别问题的层/位置(前端) ,后端等);
使用Java监视控制台(如visualVM)来监视GC活动。你只需要id来启用JMX;对于您的特定问题,GC很可能消耗大量CPU周期来摧毁内存;
如果您无法停止申请:
[1] http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html
答案 5 :(得分:0)
如果您无法在本地系统上重现它,则可能与线程有关。
我建议你按照这些步骤操作。
如果您没有找到任何东西,请再次进行转储。 (保留第一个) 1.与线程转储相比,您看到的所有线程看起来都处于相同的位置。 (忽略从接受者线程等待工作的人。特定于Tomcat)
我过去遇到的类似问题是
答案 6 :(得分:0)
我想这会帮助你,因为你说你正在使用ssh而没有用户界面,
http://www.tikalk.com/java/java-performance-tuning-session-full-tutorial
您可以进行线程转储或内存转储,然后将其导入JVisualVM进行调查。