1

我有一个 Java SE 桌面应用程序,它使用大量内存(需要 1.1 GB)。所有目标机器(Win 7、Win Vista)都有足够的物理内存(至少 4GB,大多数有更多)。还有足够的空闲内存

现在,当机器有一些正常运行时间并且启动和终止许多程序时,内存会变得碎片化(这是我假设的)。这会导致JVM启动时出现以下错误:

  JVM creation failed
  Error occurred during initialization of VM
  Could not reserve enough space for object heap

在这种情况下,即使关闭所有正在运行的程序也无济于事(尽管任务管理器和其他工具报告了足够的可用内存)。唯一有帮助的是重新启动机器并启动 Java 应用程序作为第一个启动的程序之一。据我调查,Oracle VM 需要一块连续的内存

当这个数量可用但可能碎片化时,是否有任何其他方法可以为我的 java 应用程序分配大约 1.1 GB 的堆?

我使用以下参数启动我的 JVM:

-J-client -J-Xss2m -J-Xms512m -J-Xmx1100m -J-XX:PermSize=64m -J-Dsun.zip.disableMemoryMapping=true
4

1 回答 1

2

当这个数量可用但可能碎片化时,是否有任何其他方法可以为我的 java 应用程序分配大约 1.1 GB 的堆?

使用没有碎片化虚拟内存的操作系统。例如 64 位 Windows 或任何版本的 UNIX。

顺便说一句,我很难想象这首先是怎么可能的,但我知道情况就是这样。每个进程都有自己的虚拟内存,因此它的虚拟内存安排不应该依赖于任何已经运行或之前运行过的东西。

我相信这可能是 MS-DOS TSR 时代的遗留问题。加载的共享库在内存中被赋予绝对地址(添加到签名地址空间的末尾,2 GB,高半部分为操作系统保留,最后 512 MB 为 BIOS 保留)意味着它们必须在每个内存中使用相同的地址范围程序中使用它们。随着时间的推移,最大地址由加载或使用的最低共享库确定(我不知道是哪一个,我怀疑是最低加载的)

于 2012-10-23T11:42:38.323 回答