如何配置一个非常大的Java webapp?

如何配置一个非常大的Java webapp?,java,web-applications,profiling,Java,Web Applications,Profiling,我有一个非常大的Java应用程序。它运行在Tomcat上,是典型的Spring/Hibernate Web应用程序。它也是一个非常大的Java程序。对我来说,测试数据库查询的性能很容易,因为我可以单独运行这些查询,但我不知道如何在这样的堆栈上查找Java瓶颈。我尝试了Eclipse的TPTP profiler,但它似乎真的不喜欢我的程序,我怀疑这是因为我的程序太大了。有人对分析大型Web应用程序有什么建议吗?试试jProfiler。如果您可以让Tomcat和您的应用程序运行,那么与集成就很容易了

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

试试jProfiler。如果您可以让Tomcat和您的应用程序运行,那么与

集成就很容易了

然后您可以使用内置的Netbeans来测试性能、内存使用情况等


在Netbeans中的tomcat上。

我从来没有找到一个简单的方法来实现这一点,因为通常会发生很多事情,很难获得一个清晰的整体画面。对于Hibernate这样的应用程序,更是如此,因为正确的行为可能是为缓存的数据获取一大块内存,即使你的应用程序并没有真正“做任何事情”,因此你运行的另一个内存效率低下的进程可能会被分析淹没

您是针对内存、速度进行评测,还是仅仅针对性能不佳进行评测?试着孤立地测试您怀疑不好的流程,这当然容易得多

JProbe,JProfiler,都是好的,免费的演示。在IDE内部测试会使内存问题复杂化,我发现不用麻烦更容易。

现在随JDK提供的探查器可以连接到正在运行的进程,并且至少可以提供性能的初步概述。它基于Netbeans探查器。

试试看。它有试用许可证,功能非常齐全。要使用它,您必须:

  • 将JProfiler代理作为参数添加到java命令中
  • 在服务器上启动程序
  • 启动JProfiler并选择“连接到远程运行的应用程序”
  • 给它端口号和它运行的主机
所有这些都在JProfiler附带的说明中,但重要的是,您将通过主机和端口连接到正在运行的应用程序

至于配置什么,我相信您对内存/CPU密集型的事情有一个想法——加载大型数据集、排序,如果操作不正确,甚至是简单的网络I/O。执行这些操作(如果您可以使用一些在服务器上运行的脚本来自动执行负载测试,那就太好了),并使用JProfiler收集快照

然后在空闲时查看图表。打开CPU监控,观察CPU周期在何处使用。您将能够在每个方法调用中按百分比缩小范围,因此,如果您在具有源代码的方法中使用了超过1%或2%的CPU,请进行调查,看看是否可以降低这些方法的CPU密集度

记忆也是如此。禁用所有CPU配置文件,启用所有内存配置文件,再次运行测试并获取快照

冲洗,重复

您可能还需要花些时间阅读有关内存管理和垃圾收集的内容。调整垃圾收集的最佳时机莫过于您已经在分析:


请特别注意伊甸园/幸存者对象升级部分。在web应用程序中,您会得到许多短期对象,因此,以牺牲终身代为代价增加年轻一代通常是有意义的。

我使用YourKit分析了8GB堆的应用程序,效果非常好。

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

好吧,我们的应用程序在可接受的性能参数范围内工作,但我想看看“幕后”是否有任何明显的瓶颈。我听说它从来都不是你期望的那样。请注意,Visual VM在Sun JVM中工作得最好。如果最初的asker使用了另一个JVM,那么最有可能需要的就是让visualvm看到并连接到正在运行的进程。