1

我们在生产环境中有一个 Spring 2.0.8 应用程序,在 Tomcat 5.5.x 和 JRE 1.5.x 上运行(是的,我知道,我们应该升级,现在不是重点),我们选择 Oracle 11g 作为数据库。

我们在几个月前(我会说是 7 月)升级了应用程序,并在过去一个月左右从 Oracle 10g 切换到了 Oracle 11g(还更改了 Oracle JDBC 驱动程序以匹配数据库版本)。

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

我们的设置是:

  • 运行服务器的 Windows 机器
  • 启用 SSO 的 Apache 2.2 和 Tomcat 5.5,总内存:128MB,最大内存:512MB
  • Spring 2.0.8 网络应用
  • 甲骨文 11g

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

  • 检查日志 - 似乎没有模式。显然,日志只会告诉您服务器何时内存不足,因此它们显示不再工作的点,而不是问题开始的点
  • 重新启动服务器
  • 重新安装Tomcat
  • Tomcat 可以使用的内存量增加 - 这只是延长了问题,当然 Tomcat 吃的和我们给的一样多
  • 全新安装服务器和 Apache+Tomcat
  • 生成堆转储 - 看起来没什么特别的,大部分内存用于启动应用程序
  • 检查数据库 - 很好,快速且响应迅速,没有锁

我正在寻找其他可以做什么的想法。我们总共在 5 个不同的作品中使用了相同的设置,这个有问题的设置是用户和数据数量最少。

4

2 回答 2

1

现在您已经弄清楚了,我建议您将以下内容添加到要尽快做的事情列表中:

  • 将您的 JVM 升级到 Java 7。Java 5 已“报废”,这意味着您将不再获得任何安全补丁……除非您签订了 Oracle Java 支持合同。

  • 如果您无法升级到 Java 7 ... 或 Java 6,那么至少升级到您可以获得的最新 Java 5 补丁版本。

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

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

而且,如果您计划对该系统进行任何重要的开发工作,请考虑将其升级到 Spring 3.x。

于 2012-10-31T07:39:59.953 回答
0

好的,我们解决了这个问题。事实证明,这是一个写得很糟糕的 SQL 查询,几乎没有使用过。分析堆转储有助于找到占用大量内存的对象,我们从那里开始。

于 2012-10-31T07:19:57.563 回答