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

时间:2011-04-26 09:22:22

标签: java memory memory-management garbage-collection windows-server-2003

我们有一个运行正常一年的应用程序。它是一个Web应用程序,在Windows Server 2003企业版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应用程序正在客户服务器上运行而我们无法访问它。

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

此处提供更多信息:http://support.microsoft.com/kb/971812

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

答案 2 :(得分:0)

  

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

     

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

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

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

如果不了解更多内容,就不能分配更多内存而提供任何合格建议真的很难。

答案 3 :(得分:0)

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

相关问题