Windows XP上的Java最大内存

Windows XP上的Java最大内存,java,windows,memory,Java,Windows,Memory,我一直能够为运行在32位WindowsXP(Java1.4、1.5和1.6)上的JavaSE分配1400兆字节 今天,我在使用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. 经

我一直能够为运行在32位WindowsXP(Java1.4、1.5和1.6)上的JavaSE分配1400兆字节

今天,我在使用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的内存。

JVM需要连续内存,并且取决于其他运行的内存、以前运行的内存以及Windows管理内存的方式,您可以获得最多1.4GB的连续内存。我认为64位Windows将允许更大的堆。

如果分配一个巨大的块,sun的JDK/JRE需要连续的内存量


操作系统和初始应用程序倾向于在加载过程中分配位和块,从而分割可用RAM。如果连续块不可用,SUN JDK将无法使用它。Bea的JRockit(由Oracle收购)可以从片段中分配内存。

我认为它更多地与Windows的配置有关,正如此响应所暗示的:


还有一些测试:我能够在一台只有768MB物理RAM(加上虚拟内存)的旧WindowsXP机器上分配1300MB。在我的2GB内存机器上,我只能得到1220MB。在其他各种公司机器上(使用较旧的Windows XP),我能够获得1400MB。具有1220MB限制的机器非常新(刚从戴尔购买),因此可能有更新(且更臃肿)的Windows和DLL(运行的是Windows XP Pro版本2002 SP2)。

Sun的JVM需要连续内存。因此,可用内存的最大数量由内存碎片决定。尤其是当加载到某个预定义的基址时,驱动程序的DLL往往会对内存进行分段。因此,您的硬件及其驱动程序决定您可以获得多少内存

这方面的两个来源和Sun工程师的声明:


也许是另一个JVM?你试过了吗?我认为他们计划允许非连续内存。

请记住,Windows有虚拟内存管理,JVM只需要在其地址空间中连续的内存。因此,系统上运行的其他程序不一定会影响堆大小。会妨碍您的是加载到地址空间的DLL。不幸的是,Windows中的优化使链接过程中DLL的重新定位最小化,这使得您更有可能拥有碎片化的地址空间。除了常见的东西外,还有可能侵入你的地址空间的东西,包括安全软件、CBT软件、间谍软件和其他形式的恶意软件。差异的可能原因是不同的安全补丁、C运行时版本等。设备驱动程序和其他内核位有自己的地址空间(4GB 32位空间中的其他2GB)

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


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

这与连续内存有关

以前有人这么问,据说是从“虚拟机神”那里问的:

我们需要连续内存的原因 堆的区域是我们有一个 一堆边数据结构 按与基准面的偏移量(缩放)编制索引 堆的开始。例如,我们 使用 具有一个字节的“卡标记数组” 对于堆的每个512字节。当我们 在我们拥有的堆中存储一个引用 要在中标记相应的字节,请执行以下操作: 卡片标记阵列。我们右移 存储和存储的目标地址 使用它来索引卡标记数组。 有趣的算术游戏 在Java中不能做到你能做到的 to:-在C++中玩.< /P> 通常情况下,我们不会有麻烦 适度相邻区域(最多约 Windohs上的容量为1.5GB,Solaris.YMMV上的容量约为3.8GB。)。在Windohs上 问题主要是有一些 在 JVM启动时会破坏 地址空间。使用/3GB交换机 不会重新设置这些库的基址,所以 对我们来说仍然是个问题

我们知道如何制作块堆,但是 使用它会有一些开销 他们。我们有更多的要求更快 存储管理比我们的 32位JVM中更大的堆。如果你 如果想要大堆,请切换到 64位JVM。我们仍然需要继续努力 记忆,但它更容易进入 64位地址空间


Windows的Java堆大小限制为:

  • 32位Java上可能的最大堆大小:1.8 GB
  • 建议对32位Java的堆大小限制:1.5GB(或带有/3GB选项的1.8GB

这并不能帮助您获得更大的Java堆,但现在您知道您不能超过这些值。

可以处理非连续堆,在Windows 2003/XP上,通过/3GB开关,Java堆大小可以达到2.85 GB。碎片似乎对Java堆的大小有很大的影响。

首先,当您有4GB的RAM时,使用页面文件是没有用的。Windows无法访问超过4GB的数据(实际上,由于内存不足,访问量会减少),因此页面文件未被使用

其次,地址空间被分成2部分,一半用于内核,一半用于用户模式。如果您的应用程序需要更多的RAM,请使用boot.ini中的/3GB选项(确保java.exe标记为“大地址感知”(谷歌获取更多信息)

第三,我认为您无法分配完整的2GB地址空间,因为java在内部浪费了一些内存(对于线程、JIT编译器、VM初始化)
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
 java -XX:+PrintFlagsFinal