Java在Windows XP上的最大内存

我一直能够为运行在32位Windows XP(Java 1.4,1.5和1.6)上的Java SE分配1400兆字节。

java -Xmx1400m ...

今天,我在使用Java 1.5_16和1.6.0_07的新Windows XP机器上尝试了相同的选项,并得到以下错误:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

通过试验和错误,似乎1200兆字节是我可以在这台机器上分配的最多。

任何想法为什么一台机器会允许1400和另一台只有1200?

编辑:该机具有4GB的RAM,Windows可以识别大约3.5GB。


请记住,Windows具有虚拟内存管理,JVM只需要在其地址空间中连续的内存。 所以,在系统上运行的其他程序不一定会影响你的堆大小。 你会得到什么是将DLL加载到你的地址空间。 不幸的是,在Windows中优化最大限度地减少DLL在链接期间的重定位使得它更可能具有碎片化的地址空间。 除通常的东西外,可能切入到地址空间的内容包括安全软件,CBT软件,间谍软件和其他形式的恶意软件。 可能导致差异的原因是不同的安全补丁,C运行时版本等。设备驱动程序和其他内核位具有自己的地址空间(4GB 32位空间中的另外2GB)。

您可以尝试在您的JVM进程中查看您的DLL绑定,并试着将您的DLL重新绑定到更紧凑的地址空间。 不好玩,但如果你绝望......

或者,您可以切换到64位Windows和64位JVM。 尽管其他人建议,尽管它会咀嚼更多的RAM,但您将拥有更多连续的虚拟地址空间,并且连续分配2GB将是微不足道的。


这与连续的内存有关。

以下是我在网上找到的一些信息,以前有人问过,据推测来自“虚拟神”:

我们需要一个连续的堆内存区域的原因是,我们有一堆边数据结构,它们是从堆的开始处按(缩放)偏移量进行索引的。 例如,我们用一个“卡标记数组”来跟踪对象引用更新,每个512字节的堆有一个字节。 当我们在堆中存储参考时,我们必须标记卡标记数组中的相应字节。 我们右移商店的目的地址并使用它来索引卡片标记数组。 有趣的寻址算术游戏,你不能在Java中做到,你必须:(以:-)来玩C ++。

通常我们在获得适度的连续区域(在Windohs上高达约1.5GB,在Solaris上高达约3.8GB YMMV)没有困难。 在Windohs上,问题主要是在JVM启动之前有一些库被加载,这些库分割了地址空间。 使用/ 3GB开关不会重定义这些库,所以它们仍然是我们的问题。

我们知道如何制作大块堆,但使用它们会有一些开销。 与32位JVM中的大堆相比,我们对更快速的存储管理提出了更多要求。 如果您真的想要大堆,请切换到64位JVM。 我们仍然需要连续的内存,但在64位地址空间中更容易。


Windows的Java堆大小限制是:

  • 32位Java上最大可能的堆大小: 1.8 GB
  • 建议在32位Java上使用堆大小限制: 1.5 GB (或使用/ 3GB选项时为1.8 GB
  • 这并不能帮助你获得更大的Java堆,但现在你知道你不能超越这些值。

    链接地址: http://www.djcxy.com/p/14553.html

    上一篇: Java maximum memory on Windows XP

    下一篇: Could not reserve enough space for object heap