2012-01-19 55 views
2

我有一个完全使用Java编写的Web应用程序。 Webapp不使用任何图形/模型框架,而是使用模型视图控制器。它仅由Servlet规范(Servlet版本2.4)完成。 自2001年开发的webapp,它非常复杂。最初是为了与Tomcat 4.x/5.x一起工作而构建的。实际上,运行在Tomcat 6.x上。但是,我们仍然有内存泄漏。Java Web应用程序性能问题

在深度,web应用程序的规格可以恢复为:

  • 用途的Servlet v 2.4规范。
  • 它不使用任何框架
  • 它不使用的JavaEE(不EJB)
  • 它基于JavaSE的(使用Servlet)只有
  • 在IE 6+(因为它是年龄)

基础设施规格

其实,webapp的工作在三种环境:

首先

  • IBM服务器(我不记得确切的型号)
  • 英特尔至强2.4GHz的
  • 32GB RAM
  • 1TB移动硬盘
  • 的Tomcat(第6版)配置使用8GB内存

第二个

  • 戴尔服务器
  • 英特尔至强2.0GHz的
  • 4GB内存
  • 500GB的硬盘
  • 的Tomcat(5.5版)被配置为使用的RAM
  • 1.5GB

  • 戴尔服务器
  • AMD皓龙1214 2.20Ghz
  • 4GB内存
  • 320GB HDD
  • 的Tomcat(第6版)被配置为使用的RAM
  • 1.5GB

数据库规范

该Web应用程序使用SQL Server 2008 R2 Express Edition作为DBMS,第一个服务器规范的用户除外,该用户使用SQ L Server 2008 R2标准版。对于连接池,应用程序使用Apache DBCP。

问题

那么,它具有非常严重的性能问题。 Webapp不断减速,并且多次拒绝服务。恢复应用程序的唯一方法是重新启动Apache Tomcat服务。 在性能审计过程中,我发现了一些编程问题(如永不关闭的数据库连接,超出使用Vector集合[而不是ArrayList])。

我想知道如何提高应用程序的性能,哪些应用程序可以帮助我监视Tomcat性能和Web应用程序内存使用情况。

所有的建议很乐意接受。

+1

魔法8球说:独角兽! –

+0

您是否真的尝试过找出瓶颈所在?堆转储找到内存泄漏?分析以查看是否有任何处理器周期耗尽?像[New Relic](http://newrelic.com/),如果减速只会随着时间的推移而变得明显?除了没有定论的“审计”之外的任何事情? – millimoose

+0

什么是Java内存参数? – Pushkar

回答

2

我会从一些可以帮助您分析应用程序的工具开始。由于您正在开发webapp,因此您需要从Lambda ProbeJava melody开始。

第一步是确定应用程序开始出现奇怪行为的条件。问自己几个问题:

  1. 性能问题是在应用程序启动后还是加班后出现的?
  2. 性能问题是否与客户请求数量相关?
  3. 什么是真正的性能问题 - 服务器负载较高或内存不足(请注意它们是相关的,因此请检查哪一个先启动)
  4. 有没有任何后台进程正在执行某些大规模操作?他们是否计划在特定时间段运行?

尝试在深入代码之前找到一些线索。它会帮助你缩小可能的原因。如Joshua Bloch在他的书“有效的Java”中所述 - 性能问题很少是源代码中一些小错误的影响(当然,虽然Java构造的滥用会导致灾难)。通常原因是糟糕的系统(API)体系结构。

基于我的经验的最后一个建议 - 尽量不要认为高内存消耗是不好的。 Tomcat将使用尽可能多的内存作为操作系统,JVM将允许他(不超过最大设置)以及当它需要更多时 - Tomcat将执行垃圾收集。所以一个典型的(正确的!)内存消耗图看起来像锯。如果你正在处理内存泄漏,那么图形将不断增加,但无限期地增加。这是最经常被误解的内存泄漏,所以记住它。

说实话 - 我们无法帮到你。这些只是指针,现在你将不得不进行广泛的研究,找出原因:)

+0

我曾经用Javamelody做过很多改进。你把它作为一个servlet过滤器和一个JDBC代理。如果你使用了一些框架(例如EJB,Spring,Guice),它会容易得多。我也同意它看起来像内存泄漏。 –

+0

@ŁukaszBachman好吧,看起来不错!我会看看这些工具。我有一个问题:确切地说,为什么“编程问题”不能成为内存消耗/性能问题的主要原因? –

+0

@Astantler - 好吧,他们可能会,但他们往往不是:)我会给你发私人消息,评论太短;) –

0

好的。所以我看到巨大的Java应用程序运行较少的配置。您应该尝试执行以下操作 -

  1. 首先将Profiler连接到您的应用程序,并查看应用程序的哪一部分花费最多时间。你可以使用JProfilerEclipse MAT(我个人比较喜欢JProfiler)。也试着看看最需要记忆的物体。这将有助于缩小您需要重写的部分以提高性能。

  2. 一旦你已经采取了看看内存泄漏更新您的应用程序使用64位JDK(假设它已经没有这样做)

  3. 看看你的JVM参数并对其进行优化。

+0

好的,但我有一些关于你的问题: –

+0

1. 64位JDK:它是否改善了整体性能?有什么区别?对不起,但我根本听不懂。 2.优化Tomcat参数:这些是我在Tomcat 6中的参数: http://pastebin.com/ZM1bTHTf 最近,我添加了“-XX:GCTimeRatio = 9”来增加垃圾收集。我不知道这个说法是否改善了内存使用情况。 “优化它们”是什么意思? –

1

通常的解决方案是使用例如轮廓仪等。 YourKit具有可重现问题的实际工作负载。

我要做的首先是CPU只有轮廓,内存只有轮廓终于在一次一个CPU &内存配置文件(我再看看CPU剖析结果)

YourKit还可以监测你的高级操作这样的Java EE资源和JDBC连接。我没有尝试过这些,因为我没有使用它们。 ;)

它可以提高工作效率的好主意,即使它不是因为它会降低这些配置文件的“噪声”量,使您的问题比较明显的问题的原因。

你可以尝试增加可用的内存量,但一个怀疑这只会拖延问题。

3

你也可以尝试stagemonitor。它是一个开源的性能监控库。它记录请求响应时间,JVM度量标准,请求详细信息,包括请求期间被调用方法的调用栈(配置文件)等等。由于开销较低,您还可以在生产中使用它。

调谐过程将是如下。

  • 找出与该请求仪表盘 request dashboard
  • 缓慢请求分析与Request Detail Dashboard请求的堆栈跟踪,以了解缓慢方法
  • 潜入你的代码,并尝试优化这些缓慢的方法
  • 您还可以将一些指标(如吞吐量或会话数量)与响应时间或CPU使用率相关联
  • 分析堆用JVM Memory Dashboard

注:我stagemonitor的开发商。