【问题标题】:Could not allocate enough heap space to Java无法为 Java 分配足够的堆空间
【发布时间】:2011-04-26 09:22:22
【问题描述】:

我们有一个运行良好一年的应用程序。它是一个 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 应用程序在客户服务器上运行,而我们无权访问它。

【问题讨论】:

  • -Xmx1024m -Xmx128m,真的吗?你的意思是-Xmx1024m -Xms128m(注意-Xms)?
  • 物理地址扩展:en.wikipedia.org/wiki/Physical_Address_Extension - 这意味着 32 位处理器可以访问超过 4 GB 的内存。
  • 另外我忘了说我们在“C:\Program Files\Java\jre1.6.0_07”中找到了一个 JRE 1.6。 JDK(即 1.5)不在系统路径中,但上面的测试使用的是 JDK 而不是 JRE。 Tomcat 也被配置为使用 JDK。
  • Ouups sorru:是的,它是 -Xmx1024m -Xms128m
  • 尝试其他 JVM - 最新的 1.6、最新的 1.5、最新的 1.7。 JVM 可能有问题

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


【解决方案1】:

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

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

【讨论】:

  • ...我知道这个上限。当我尝试在一台装有 32 位 XP 的怪物笔记本电脑上预编译一些 weblogic 东西时,它是一个真正的展示者。安装了 4 gig 物理内存,无法获取超过 1.4 gig 的内存,这还不够。
  • 这部分是错误的。 Java 需要连续的虚拟内存。其他程序的存在是无关紧要的。
  • better:其他程序是否在运行,无关紧要;可能相关的是其他程序是否安装了被加载到每个程序中的 DLL,例如 JVM
  • @DavidBalažic 在 Windows 上,TSR 程序和库可以加载所有应用程序的相同地址。这会占用 JVM(和所有程序)的虚拟地址空间
【解决方案2】:

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

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

更多信息在这里:http://support.microsoft.com/kb/971812

我们会检查补丁是否解决了这个问题。 敬请期待

【讨论】:

  • 我在 Windows 7(开发者机器)上遇到了类似的问题。以前可以运行的应用程序开始出现问题,我不得不降低内存。设置。不过,我只看到安全公告中提到的 Windows Server 版本...
【解决方案3】:

我也不明白为什么它工作得很好,突然停止工作了!似乎操作系统现在无法分配连续内存或其他东西(页面文件大小、用户内存分配......)

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

嗯,你应该检查有多少内存可用,如果不够,你应该检查是什么消耗了那么多内存。

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

如果不了解更多信息,很难甚至不可能就为什么不能分配更多内存提供任何合格的建议。

【讨论】:

  • 可用内存约为9Go
【解决方案4】:

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

【讨论】:

  • 我们的客户说他重新启动了服务器。所以我想他做到了!
  • 我们的客户说他重新启动了服务器。所以我想他做到了!但是我真的不明白为什么它上周起作用了,突然就不行了。此外,我运行了一个简单的 VMWare VM,只有 1Go 的 RAM(Windows XP),我能够分配多达 1.2Go(java -Xmx1200m -version")我知道如果没有关于客户在服务器上做了什么的信息,它会很难解决这个问题。是否有任何实用程序可以查看(例如以图形方式),操作系统上有多少连续内存可用?
  • @Eric Talx:您必须设置 -Xms1000m(起始内存),因为仅设置最大值实际上不会分配那么多内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2014-02-28
  • 2013-07-21
  • 2019-11-29
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多