2012-10-29 60 views
1

Java堆空间错误,我们在生产中春2.0.8应用,在Tomcat的5.5.x和JRE 1.5.x的运行(是的,我知道,我们应该升级,这不是现在的问题),使用Oracle 11g作为我们的DB选择。突然在Tomcat 5.5

我们已经在几个月前升级应用程序(我说7月)和在过去一个月已经从Oracle 10g中切换到Oracle 11g左右(也改变了Oracle JDBC驱动程序相匹配的数据库版本)。

我们一直有在生产造成了严重和意想不到的问题。截至前一天,相隔数小时的时间内出现了堆空间OutOfMemory错误。这反过来会使响应时间减慢大约100倍,或者用户无法连接。

我们的设置是:

  • Windows机器运行服务器
  • 的Apache 2.2和Tomcat 5.5 SSO启用,总内存:128MB,最大内存:512MB
  • 春2.0.8的webapp
  • 的Oracle 11g

由于注意到这个错误,这就是我们的尝试:

  • 检查出的日志 - 似乎没有成为一个模式。 显然,日志只能告诉你,当服务器的内存不足,所以 他们表现出的,而不是点 问题出在哪里开始
  • 重新启动服务器
  • 重新安装Tomcat的
  • 增加量不再工作的地步, Tomcat可以使用的内存 - 这只是延长了这个问题,当然Tomcat吃了就和我们一样吃了
  • 全新安装了服务器和Apache + Tomcat
  • 生成堆转储 - 没有什么壮观的东西似乎与众不同,大多数内存用于启动t他申请
  • 检查DB - 它的优良,快速反应,没有锁

我找出来对自己能做什么的想法。我们总共有5种不同的产品具有相同的设置,这个问题是用户和数据的最小数量。

+2

您是否启用GC日志记录?你的服务器是否在异常时产生堆转储? –

+0

如何去做这件事?作为一名开发人员,我并不以我对服务器管理知之甚少的事实感到自豪。我认为我们设置了热量转储以产生按需和异常内存异常。 – eagerMoose

+0

您是否在监视JVM进程中的内存使用量与请求和加载的数量? –

回答

0

好吧,我们想通了这一个了。事实证明,这是一个很糟糕的SQL查询,很少使用。分析heapdump帮助找到了占用大量内存的对象,然后我们从那里开始。

1

现在你已经想通了,我建议你添加以下的事情的清单,以真正很快做到:

  • 升级您的JVM中的Java 7的Java 5已经“最终这意味着你将不会获得更多的安全补丁......除非你使用的是Oracle Java支持合同。

  • 如果您不能升级到Java 7 ...或Java 6,那么至少升级到最新的Java 5修补程序版本,您可以掌握该版本。

  • 升级到Tomcat 6或7,或至少到最近的Tomcat 5.5。

  • 要避免OutOfMemoryError导致严重降速的问题,请确保您的JVM命令行上有-XX:+UseGCOverheadLimit选项。

而且,如果您打算在该系统上执行任何重要的开发工作,请考虑将其升级到Spring 3.x.