如何分析非常大的Java Web应用程序?

时间:2009-03-23 15:43:09

标签: java web-applications profiling

我有一个非常大的Java应用程序。它运行在Tomcat上,是典型的Spring / Hibernate webapp。它也是一个非常大的Java程序。我很容易测试数据库查询的性能,因为我可以单独运行它们,但我不知道在这样的堆栈上查找Java瓶颈。我尝试过Eclipse的TPTP分析器,但它似乎并不喜欢我的程序,我怀疑这是因为我的程序太大了。有没有人对分析大型webapp有任何建议?

8 个答案:

答案 0 :(得分:4)

JDK现在附带的Visual VM分析器可以附加到正在运行的进程,并且至少可以初步概述性能。它基于Netbeans分析器。

答案 1 :(得分:1)

试试jProfiler。与Tomcat

集成很容易

答案 2 :(得分:1)

如果您可以在Netbeans中运行Tomcat和您的应用程序。

然后你可以使用Netbeans内置profiler来测试性能,内存使用情况等......

Wikipage在Netbeans的tomcat上。

答案 3 :(得分:1)

我已经使用YourKit对8 GB堆的应用程序进行了分析,并且运行良好。

答案 4 :(得分:1)

检查JAMon。它不是分析器,但它是我可以推荐的最佳分析工具。它很容易与弹簧集成。我们在测试和现场环境中使用它。

答案 5 :(得分:0)

我从来没有找到一种简单的方法来做到这一点,因为通常会有这么多事情,因此很难获得清晰的整体情况。像Hibernate这样的东西更是如此,因为正确的行为可能是为缓存数据占用大量内存,即使你的应用程序并没有“做任何事情”,所以你运行的另一个内存效率低下的进程可能会在分析中淹没。 / p>

您是在分析内存,速度,还是只是寻找性能不佳?尝试测试您怀疑孤立的过程,这当然要容易得多。

JProbe,JProfiler,这两个好的免费演示都可用。在IDE内部进行测试会使内存问题变得复杂,我发现它更容易打扰。

答案 6 :(得分:0)

Try this.这可能比你想象的要简单,但它确实有效。

答案 7 :(得分:0)

试试JProfiler。它有一个试用许可证,功能非常全面。要使用它,您必须:

  • 将JProfiler代理添加为java命令的参数
  • 在服务器上启动程序
  • 启动JProfiler并选择“连接到远程运行的应用程序”
  • 为其提供端口号及其正在运行的主机

所有这些都在JProfiler附带的说明中,但重要的是你将通过主机和端口连接到正在运行的应用程序。

至于要分析的内容,我确信你已经知道可能是内存/ CPU密集型的东西 - 加载大型数据集,排序,甚至简单的网络I / O如果做错了。做这些事情(如果您可以使用服务器上的某些脚本自动进行负载测试,并且使用JProfiler收集快照,那就太棒了。

然后随意查看图表。打开CPU监控并观察CPU周期所花费的位置。您可以在每个方法调用中按百分比缩小范围,因此如果您在源代码的方法中使用的CPU超过1%或2%,请进行调查,看看是否可以降低CPU密集度。

内存也一样。禁用所有CPU分析,启用所有内存分析,再次运行测试并获取快照。

冲洗,重复。

您可能还需要花时间阅读内存管理和垃圾回收。现在没有比调整垃圾收集时更好的时间了:http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

特别注意关于伊甸园/幸存者对象促销的部分。在网络应用程序中,你会得到很多短命的对象,所以以牺牲终生代为代价来增加年轻一代通常是有意义的。