如何追查性能损失的原因?

时间:2011-09-05 11:19:30

标签: java performance

我在Tomcat 6上运行基于Java的多用户Web应用程序。

出于某种原因,1天后整个应用程序变得非常慢。

"top"表示CPU处于120%(由tomcat进程引起),尽管在线用户不多,所以我假设存在某种无限循环(或类似问题)。< / p>

在我的本地系统上,我无法重现该问题。 我也无法找出导致问题的部分(哪个类/方法)。

调试此问题的最佳方法是什么?

7 个答案:

答案 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)

曾经发生在我身上,这是我打算处理它的计划:

  1. 转到生产环境或发生问题的任何环境,并在那里工作一整天。
  2. 尝试每隔一两个小时集中精力处理应用程序的特定部分/模块。
  3. 查找日志文件中的任何异常。
  4. 完成所有这些后,您可能会完全了解或至少大致知道系统的哪个部分导致问题。
  5. 祝你好运

答案 3 :(得分:0)

有很多分析器知道哪个线程消耗更多的jvm时间,我们也可以从工具本身那里得到建议。下面是一些分析器

<强>的JProfiler,  tptpprofiler

答案 4 :(得分:0)

如果您可以停止应用程序服务器:

  • 使用java代理检测应用程序(有关详细信息,请参阅[1])。有些产品使用这种技术为您提供J2EE性能指标(平均响应时间,每个时间间隔的响应,并发调用,aso。)开箱即用(Wily Introscope)因此,您可以快速识别问题的层/位置(前端) ,后端等);

  • 使用Java监视控制台(如visualVM)来监视GC活动。你只需要id来启用JMX;对于您的特定问题,GC很可能消耗大量CPU周期来摧毁内存;

如果您无法停止申请:

  • 解析您的日志文件,搜索效果指标
  • 解析特定日志文件(f.exemple详细GC日志文件)

[1] http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

答案 5 :(得分:0)

如果您无法在本地系统上重现它,则可能与线程有关。

我建议你按照这些步骤操作。

  1. 使用jstack进行线程转储。 (jstack -l)
  2. 在转储文件的开头检查是否有关于死锁的内容。
  3. 如果您没有找到任何东西,请再次进行转储。 (保留第一个) 1.与线程转储相比,您看到的所有线程看起来都处于相同的位置。 (忽略从接受者线程等待工作的人。特定于Tomcat)

    我过去遇到的类似问题是

    1. Hashmap进入无限循环。它会将你的CPU旋转到100%。
    2. 某些循环因无法满足某些条件而无限运行。
    3. 旋转cpu的垃圾收集。您可以通过向JVM添加额外的参数来检测gc是否也在运行。
    4. 祝你好运。

答案 6 :(得分:0)

我想这会帮助你,因为你说你正在使用ssh而没有用户界面,

http://www.tikalk.com/java/java-performance-tuning-session-full-tutorial

您可以进行线程转储或内存转储,然后将其导入JVisualVM进行调查。