我有一个完全用Java制作的Web应用程序。 Web应用程序不使用任何图形/模型框架,而是使用模型 - 视图控制器。它仅使用Servlet规范(Servlet版本2.4)。 自2001年以来开发的webapp,它非常复杂。最初,是为使用Tomcat 4.x / 5.x而构建的。实际上,在Tomcat 6.x上运行。但是,我们仍然有记忆泄漏。
在深度方面,Webapp的规范可以恢复为:
基础设施规范
实际上,webapp在三种环境中运行:
第一的
第二
第三
数据库规范
webapp使用SQL Server 2008 R2 Express Edition作为DBMS,但使用SQL Server 2008 R2 Standard Edition的第一个服务器规范的用户除外。对于连接池,该应用程序使用Apache DBCP。
问题
嗯,它有非常严重的性能问题。 Web应用程序不断减速,并且多次拒绝服务。恢复应用程序的唯一方法是重新启动Apache Tomcat服务。 在性能审计期间,我发现了几个编程问题(比如数据库连接永远不会关闭,过度使用Vector集合[而不是ArrayList])。
我想知道如何提高应用程序的性能,哪些应用程序可以帮助我监控Tomcat性能和Webapp内存使用情况。
很高兴接受所有建议。
答案 0 :(得分:3)
您也可以尝试stagemonitor。它是一个开源性能监控库。它记录请求响应时间,JVM指标,请求详细信息,包括请求期间被调用方法的调用堆栈(配置文件)等。由于开销较低,您也可以在生产中使用它。
调整程序如下:
注意:我是stagemonitor的开发者。
答案 1 :(得分:2)
我会从一些可以帮助您分析应用程序的工具开始。由于您正在开发使用Lambda Probe和Java melody开始的webapp。
第一步是确定应用程序开始表现奇怪的条件。问自己几个问题:
在深入研究代码之前,尝试找一些线索。它将帮助您缩小可能的原因。
正如Joshua Bloch在他的名为“Effective Java”的书中所述 - 性能问题很少是源代码中一些小错误的结果(当然,滥用Java结构会导致灾难)。通常原因是糟糕的系统(API)架构。
基于我的经验的最后一个建议 - 尽量不要认为高内存消耗是坏事。 Tomcat将使用尽可能多的内存作为操作系统,JVM将让他(不超过最大设置),只要它需要更多 - Tomcat将执行垃圾收集。因此,典型的(适当的!)内存消耗图看起来像锯。如果您正在处理内存泄漏,那么图表将不断增加,但无限期。这是最经常被误解的内存泄漏,所以请记住它。
说实话 - 我们无法帮助你。这些仅仅是指针,现在你将不得不进行广泛的研究以找出原因:)
答案 2 :(得分:1)
一般解决方案是使用分析器,例如YourKit,具有可以再现问题的实际工作负载。
我首先做的是仅CPU配置文件,仅内存配置文件,最后是CPU&一次打开内存配置文件(然后查看CPU配置文件结果)
YourKit还可以监控您的高级操作,例如Java EE资源和JDBC连接。我没有尝试过这些因为我不使用它们。 ;)
即使不是问题的原因,提高效率也是一个好主意,因为它会减少这些配置文件中的“噪音”量并使您的问题更加明显。
您可以尝试增加可用内存量,但怀疑它只会延迟问题。
答案 3 :(得分:0)
确定。所以我看到巨大的Java应用程序运行较少的配置。您应该尝试执行以下操作 -
首先将Profiler连接到您的应用程序,然后查看应用程序的哪个部分花费的时间最多。您可以使用JProfiler或Eclipse MAT(我个人更喜欢JProfiler)。还要尝试查看占用内存最多的对象。这将帮助您缩小到需要重写的部分,以提高性能。
一旦你看了一下内存泄漏,就更新你的应用程序以使用64位JDK(假设它已经没有这样做了)
查看您的JVM参数并对其进行优化。
答案 4 :(得分:0)
您可以尝试使用开源工具Webapp Watcher,以确定代码中性能问题的位置。
您首先要在网络应用中添加过滤器(as explained here)以记录指标,然后在WAW Analyzer工具中导入日志,并按照described in the doc步骤了解代码中潜在的性能问题在哪里。