15

正如我在运行 Web 应用程序 5 天后性能下降中发布的那样,如何发现瓶颈?,我有一个应用程序在运行一段时间后变慢的问题。

我让 VisualVM 运行并在不同时间之间制作了快照。现在应用程序真的很慢,但我不知道如何发现瓶颈。它们彼此之间没有太多区别,唯一增长一点的是堆,它在一段时间后成功地被垃圾收集。

谁能给我一些指示?

以下是快照(应用程序):

[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

谢谢!

编辑:仔细观察,我注意到 CPU 甚至没有被使用太多......而且系统真的很慢!

4

3 回答 3

6

作为第一步,我建议确定到底什么是慢的。它执行某些工作是否缓慢?或者在处理来自不同客户的作业时表现出低吞吐量?

什么资源不够用?

  • 如果您使用一些外部服务(如数据库或 RPC 服务器) ,请始终记录它们的响应时间并在进行任何其他优化步骤之前对其进行检查。
  • 可能是处理器能力不足。只看CPU使用率。
  • 可能是内存不足。使用 gc 日志记录来检测此类问题。有一个很好的话题
  • 可能是硬盘速度不够。使用 iostat 并了解您的 HDD 性能限制。
  • 可能是网络吞吐量不足。检查网络通道使用情况。
  • 此外,您可能会用完一些特定于操作系统的限制,例如打开的文件和/或网络套接字的数量。检查您是否正确地将所有操作系统级别的异常报告到日志文件中。

当您确定了哪些资源不足以及程序中受其影响的部分时,您可以尝试找到要优化的代码段。在不知道要查找什么的情况下使用随机工具并通过它运行您的应用程序是没有意义的。

从我个人的经验来看,当你只有一个缓慢的方法时,这是非常罕见的情况,可以通过探查器找到。很可能是算法中某处出现意外的 IO 和/或同步,或者数据库架构错误。

于 2011-08-23T15:53:33.603 回答
5

实际上,有一些比 VisualVM 更好的工具。

您可以尝试 JProfiler,它是一个不错的分析器(但已付费)

你可以试试 Netbeans 分析器,它是免费的,而且效果很好

使用 VisualVM,您将只能看到应用程序的实际状态(内存和 cpu 使用情况、JMX、加载的类等)。

于 2011-08-23T14:17:15.260 回答
1

我不会立即假设它是您的应用程序的问题,如果它是一个基于 Windows 的系统查看病毒扫描程序,那么当时运行的任何更新调度程序。

确保您的日志正在滚动并正确过滤调试,以免它们失控。

检查 sql 快照是否有任何长时间运行的查询。检查数据库负载和数据库堆。

如果您让 Visual VM 运行了一段时间,请确保您有一些线程准备好接受工作/连接将显示为黄色(空闲)。

Eclipse 内存分析器中的一个镜头

当您发现速度变慢时进行堆转储并通过分析器运行它。

如果您在基于 unix 的系统上检查文件描述符 ulimit -a 以确保 java 进程没有被最大化。

检查服务器上的 TCP NO Delay 和 Nagle 限制设置

于 2011-08-23T16:09:04.640 回答