7

基本上我们已经注意到,在某些计算机上设置 JVM 选项 -Xmx(最大堆大小)有时会导致 JVM 无法初始化,即使系统上有足够的 RAM。

例如,在 4gb 机器上,我们有 -Xmx1024m 失败但 -Xmx800m 有效。我可以理解在 1gb 机器上,甚至是 2gb 机器上,但在 4gb 机器上,特别是考虑到 Windows、Linux 等可以交换 RAM,为什么会失败?

我已经看到很多线程和问题说要减少你的最大堆大小,但没有人能解释为什么它会失败,这正是我真正想要的。

同样,你怎么说消耗尽可能多的内存,直到达到一定的大小?

4

2 回答 2

13

这可能是由于虚拟地址空间碎片造成的。可能无法为堆的最大潜在大小保留一个连续的1024MB 地址范围,具体取决于 DLL 的加载地址、线程的堆栈位置、不可移动的本机内存分配、内核保留地址等,尤其是在 32位过程。

于 2012-01-05T23:11:13.453 回答
1

不久前,我在 Windows XP 中遇到了这个问题。在大多数 XP 机器上,我可以分配 1400MB,而其他机器只有 1200MB。正如 Jeffrey Hantin 在另一个答案中所说,共识是碎片化的。

于 2012-01-05T23:34:21.057 回答