Java web应用程序运行5天后性能下降,如何发现瓶颈?

Java web应用程序运行5天后性能下降,如何发现瓶颈?,java,mysql,performance,scala,playframework,Java,Mysql,Performance,Scala,Playframework,我使用以下技术堆栈开发了一个web应用程序: 爪哇 Mysql 斯卡拉 游戏框架 DavMail集成(用于日历和exchange服务器) Javamail 阿克卡演员 在第一天,应用程序运行平稳,没有延迟。但是大约5天后,应用程序会变得非常慢!现在我不知道如何分析它,因为我有巨大的依赖性,很难复制这种东西。我看了一下记忆,似乎一切都很好 关于这个问题有什么建议吗?jconsole是JDK附带的,是一个很容易发现瓶颈的工具。将它连接到您的服务器,查看内存使用情况、GC时间,查看有多少线程处于活

我使用以下技术堆栈开发了一个web应用程序:

  • 爪哇
  • Mysql
  • 斯卡拉
  • 游戏框架
  • DavMail集成(用于日历和exchange服务器)
  • Javamail
  • 阿克卡演员
在第一天,应用程序运行平稳,没有延迟。但是大约5天后,应用程序会变得非常慢!现在我不知道如何分析它,因为我有巨大的依赖性,很难复制这种东西。我看了一下记忆,似乎一切都很好


关于这个问题有什么建议吗?

jconsole
是JDK附带的,是一个很容易发现瓶颈的工具。将它连接到您的服务器,查看内存使用情况、GC时间,查看有多少线程处于活动状态,因为可能是服务器创建了许多线程,而这些线程从未退出。

我同意tulskiy的观点。除此之外,如果使用
jconsole
进行的调查没有结论性,您还可以使用
JMeter


性能下降的可能原因是线程(已创建但从未退出)和内存泄漏:如果在出现
OutOfMemoryError
之前分配越来越多的内存,您可能会遇到一些性能下降(几周前发生在我身上)。

尝试使用-您可以监视gc行为,内存使用、堆、线程、cpu使用等。您可以使用它连接到远程VM。

要消除数据库,您可以使用慢速查询日志监视慢速查询(和/或不使用索引的查询) 见:


我想冒昧地猜测一下,您缺少了一个索引,它只会随着您的数据量的增加而变得明显。

`visualvm˙也是用于此目的的一个很好的工具,您还可以连接到远程JVM并查看其中的内容

我建议你这样做:

  • 拍摄从几个小时到5天运行的应用程序的快照
  • 比较线程数
  • 比较对象计数,搜索增加的数字
  • 查看您的程序是否在第5天比第1天花费更多的时间在特定方法上
  • 检查磁盘空间,可能磁盘空间不足
    • 另一个探查器正在运行。
      它是商业性的,但有试用期(两周)。
      事实上,我第一次尝试了@axel22建议的
      VisualVM
      ,但我们的远程服务器是ssh,我们在通过VisualVM连接时遇到了问题(并不是说这不可能,我只是在几个小时后放弃了)。

      您可能只想尝试'play status'命令,该命令将列出web应用程序的状态(线程、作业等)。这可能会给你一个关于发生了什么的提示。

      所以伙计们,在这个特定的例子中,我在开发人员模式下运行play,这使得编译器时不时地工作


      在切换到生产模式后,一切都很快,不再出现问题。但感谢所有的帮助。

      您也可以在他们的官方页面上检查您正在运行的所有内容的版本。可能问题不是源于您的代码(但是,这不太可能),并且某些内容已经修复了?