Java无法分配足够的堆空间

4
我们有一个应用程序,已经运行了一年。它是一个Web应用程序,在Windows Server 2003企业版Service Pack 2下的Microsoft Cluster上使用Tomcat 5.5 + JDK 1.5运行。服务器有11GB的RAM(我知道这没用!)并具有以下描述“物理地址扩展”:我不知道这是什么意思。
Tomcat服务配置了以下参数:-Xmx1024m -Xms128m 自上周以来,该服务不能再启动,并显示以下错误消息:“Could not allocate enough heap space”。
我们进行了几项测试:
- java -Xmx1024m -version =>失败 - java -Xmx758m -version =>失败 - java -Xmx512m -version =>通过
因此,我们可以将最大堆大小设置为更少的内存,但这不是可接受的解决方法,因为用户数量将在未来几个月内增加,我们需要将最大堆大小设置为1024Mb。
此外,我不明白为什么它之前能正常工作,然后突然停止工作!似乎操作系统现在无法分配连续的内存,或者其他原因(页面文件大小,用户内存分配等)。
由于Web应用程序正在客户服务器上运行,我们无法访问它,因此很难知道是否有任何更改(操作系统补丁,配置等)。

2
"-Xmx1024m -Xmx128m",真的吗?你是不是想说 "-Xmx1024m -Xms128m"(注意到了-Xms吗)? - Thomas
物理地址扩展:http://en.wikipedia.org/wiki/Physical_Address_Extension - 它意味着32位处理器可以访问超过4 GB的内存。 - Thomas
还有一件事我忘了说,我们发现在“C:\Program Files\Java\jre1.6.0_07”中安装了JRE 1.6。JDK(即1.5)不在系统路径中,但上述测试使用的是JDK而不是JRE。此外,Tomcat被配置为使用JDK。 - Eric Taix
抱歉:是的,它是 -Xmx1024m -Xms128m。 - Eric Taix
尝试其他JVM - 最新的1.6,最新的1.5,最新的1.7。JVM可能存在问题。 - bugs_
4个回答

6

Java需要连续的内存。在32位操作系统上,这将限制您在Windows上的内存大小在1.2到1.4 GB之间。然而,如果您的内存由于其他正在运行的程序而被分段,则可能会得到一个更小的内存区域。

使用64位操作系统,您不会遇到这个问题,而且您甚至可以为jVM分配更多的内存(如果您使用64位jVM)。


我知道这个上限。当我试图在一台带有32位XP的怪兽笔记本电脑上预编译一些Weblogic内容时,这是一个真正的障碍。已安装4GB物理内存,无法获取超过1.4GB的内存,而那还不够。 - Andreas Dolk
这部分是错误的。Java需要连续的虚拟内存。其他程序的存在是无关紧要的。 - David Balažic
更好的做法是,其他程序是否正在运行并不重要;可能重要的是,其他程序是否安装了DLL文件,这些文件会被加载到每个程序中,例如JVM。 - David Balažic
@DavidBalažic 在Windows上,TSR程序和库可以加载相同的地址,适用于所有应用程序。这会耗费虚拟地址空间,包括JVM(和所有程序)。 - Peter Lawrey

1
我有些关于我的问题的消息。
这似乎是由于Windows安全更新引起的! 这个Microsoft安全更新会阻止Java应用程序分配大量连续内存...
更多信息在这里:http://support.microsoft.com/kb/971812 我们将检查补丁是否解决了这个问题。 请保持关注。

我在Windows 7(开发机器)上遇到了类似的问题。曾经正常运行的应用程序开始出现问题,我不得不降低内存设置。尽管如此,在安全公告中仅提到了Windows Server版本... - Stijn de Witt

0
我也不明白为什么它之前能正常工作,现在却突然停止工作了!看起来操作系统现在无法分配连续的内存,或者是其他原因(页面文件大小、用户内存分配等)。
很难知道是否有任何更改(操作系统补丁、配置等),因为Web应用程序正在客户服务器上运行,我们无法访问它。
好的,您应该检查可用内存量,如果不足,您应该检查是什么占用了这么多内存。
除此之外,您需要与客户沟通,了解他们是否对服务器进行了更改,如果是,他们做了哪些更改。
没有更多信息,很难甚至不可能就为什么无法分配更多内存给出任何合格的建议。

可用内存约为9GB。 - Eric Taix

0

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


我们的客户告诉我们他重启了服务器。所以我想他确实这样做了! - Eric Taix
我们的客户告诉我们他重新启动了服务器。所以我想他确实这样做了!但我真的不明白为什么上周它还能工作,突然之间就不能工作了。此外,我运行了一个只有1GB RAM(Windows XP)的简单VMWare虚拟机,并且我能够分配高达1.2GB的内存(java -Xmx1200m -version)。我知道如果没有关于客户在服务器上做了什么的信息,解决这个问题将非常困难。是否有任何实用程序可以以图形方式查看操作系统上有多少连续内存可用? - Eric Taix
@Eric Talx:你需要设置-Xms1000m(初始内存),因为仅设置最大值并不会实际分配那么多内存。 - Denis Tulskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接