正如我在Performance drop after 5 days running web application, how to spot the bottleneck?发布的那样,我遇到一个应用程序运行一段时间后变慢的问题。
我运行VisualVM并在不同时间之间创建快照。现在应用程序真的很慢,但我不知道如何发现瓶颈。它们彼此之间没有太多差异,唯一增长的是Heap,它在一段时间后成功地被垃圾收集。
任何人都可以给我一些指示吗?
以下是快照(应用):
[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html
[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html
谢谢!
编辑:仔细观察,我注意到CPU甚至没有被太多使用..系统真的很慢!
答案 0 :(得分:6)
作为第一步,我建议确定究竟什么是慢的。它慢慢执行某项工作吗?或者展示了处理来自不同客户的工作的低吞吐量?
什么资源不合理?
由于您已经确定哪个资源效率不高以及您的程序中有哪些资源受到影响,您可以尝试找到要优化的代码段。使用随机工具并在不知道要查找的内容的情况下运行应用程序是没有意义的。
根据我的个人经验,当你只有一个慢速方法时,这是非常罕见的情况,可以通过分析器找到。很可能是在算法或错误的数据库模式中某处出现了意外的IO和/或同步。
答案 1 :(得分:5)
实际上,有一些比VisualVM更好的工具。
你可以尝试JProfiler,这是一个很好的探查器(但付费)
你可以试试Netbeans Profiler,这是免费的,效果很好
使用VisualVM,您只能看到应用程序的实际状态(内存和CPU使用情况,JMX,加载的类等)。
答案 2 :(得分:0)
我不会假设你的应用程序存在问题,如果它的基于Windows的系统看病毒扫描程序,那时运行的任何更新调度程序。
确保您的日志正在翻转并且调试已正确过滤,因此它们不会失控。
检查sql快照以查找任何长时间运行的查询。检查数据库负载和数据库堆。
如果Visual VM运行了一段时间,请确保准备好一些线程接受工作/连接将显示为黄色(空闲)。
在黑暗中拍摄 Eclipse Memory Analyzer
当您发现速度减慢并通过分析仪运行时,请进行堆转储。
如果您在基于unix的系统上检查文件描述符ulimit -a以确保java进程没有最大化。
检查服务器上的TCP NO Delay和Nagle限制设置