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

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

我们有一个应用程序可以正常运行一年。它是一个 web 应用程序,在 Windows Server 2003 Enterprise Edition Service Pack 2 上的 Microsoft Cluster 下的 Tomcat 5.5 + JDK 1.5 下运行。服务器有 11Gb 的 RAM(我知道它没用!)带有以下描述“Physical Address Extension” : 我不知道那是什么意思。

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)

关于java - 无法为 Java 分配足够的堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5788356/

相关文章:

java - 为什么在算术运算的情况下,两个 double 值的行为不一致

c++ - 堆大小不断增加直到应用程序崩溃 (C++)

java - 限制 Java CPU 和内存使用

c++ - 函数内存管理C++

java - 如何使用 Cloneable 类型作为 Java 泛型类的参数

java - 取消按钮后 GUI 卡住

java - 在 Tomcat 6 中重复出现 "PermGen"

c++ - 巨大的内存分配 : stack vs heap

iphone - 如何限制iOS应用内存使用

java - 真实世界的用户代理——它们是什么?如何设置它们? - java