无法为Java分配足够的堆空间

我们有一个运行良好一年的应用程序。 它是一个Web应用程序,在Windows Server 2003 Enterprise Edition Service Pack 2下的Microsoft Cluster下的Tomcat 5.5 + JDK 1.5下运行。服务器有11Gb的RAM(我知道它没用!),其中包含以下描述“物理地址扩展” :我不知道这意味着什么。

Tomcat服务配置了以下参数: -Xmx1024m -Xms128m

从上周开始,该服务不再需要启动并停止,并显示以下错误消息:“无法分配足够的堆空间”。

我们尝试了几个测试:

  • java -Xmx1024m -version =>失败
  • java -Xmx758m -version =>失败
  • java -Xmx512m -version =>通过

因此,我们可以使用更少的内存来获得最大堆大小,但这不是一个可接受的解决方法,因为用户数量将在几个月内增加,我们需要将最大堆大小设置为1024Mb。

另外我不明白为什么它工作正常然后突然停止工作! 似乎操作系统现在无法分配连续内存或其他内容(页面文件大小,用户内存分配……)

由于Web应用程序在客户服务器上运行而我们无法访问它,因此很难知道某些内容是否发生了变化(操作系统补丁,配置等)。

Java需要连续的内存。 在32位操作系统上,这限制了Windows在1.2到1.4 GB之间。 但是,如果由于正在运行的其他程序而导致内存碎片化,则可能会占用更小的内存区域。

使用64位操作系统不会出现此问题,您甚至可以为jVM分配更多内存(如果使用64位JVM)

我有一些关于我的问题的消息。

这似乎是由于Windows安全更新! 此Microsoft安全更新可防止Java应用程序分配大量连续内存…

有关详细信息,请访问: http : //support.microsoft.com/kb/971812

我们将检查补丁是否解决了这个问题。 敬请关注

此外,我不明白为什么它工作正常,突然停止工作! 似乎操作系统现在无法分配连续内存或其他内容(页面文件大小,用户内存分配……)

由于Web应用程序在客户服务器上运行而我们无法访问它,因此很难知道某些内容是否发生了变化(操作系统补丁,配置等)。

好吧,你应该检查一下可用的内存量,如果还不够,你应该检查消耗这么多内存的内存。

除此之外,您必须与您的客户交谈并了解他们是否对服务器进行了更改,如果是,他们确实改变了什么。

如果不了解更多内容,那么就无法提供任何有关为何无法分配更多内存的合格建议真的很难。

这可能意味着操作系统无法分配足够的连续内存。 操作系统重启后你还有问题吗? 系统是否报告它有11 Gb的RAM? Windows的PAE实现并不是最好的,因此可能会导致问题。 尝试更新到更新的JDK,如果失败,则需要64位计算机。