Java JVM堆大小

Java JVM堆大小,java,memory,jvm,Java,Memory,Jvm,我有一个应用程序,在启动时使用以下命令请求特定数量的RAM java -Xms512m -Xmx985m -jar someJarfile.jar 此命令无法在内存为8.0GB的计算机上运行,因为它无法创建指定大小的对象堆。如果我将最大范围降低到700MB以下,它就可以正常工作 更奇怪的是,当-Xmx标志值超过700m时,即使执行一个简单的java-Xmx768m-version也会失败。我正在尝试使用Java1.7UU6732位(这就是jar构建的基础),甚至是Java1.7和EventJa

我有一个应用程序,在启动时使用以下命令请求特定数量的RAM

java -Xms512m -Xmx985m -jar someJarfile.jar
此命令无法在内存为8.0GB的计算机上运行,因为它无法创建指定大小的对象堆。如果我将最大范围降低到700MB以下,它就可以正常工作

更奇怪的是,当
-Xmx
标志值超过700m时,即使执行一个简单的
java-Xmx768m-version
也会失败。我正在尝试使用
Java1.7UU6732位
(这就是jar构建的基础),甚至是Java1.7和EventJava1.8的更新版本来运行它。如果最大堆更高,并且我使用的是32位,我会理解,但它不高于32位java的~1.4GB上限

是否有一个配置参数我在某个地方遗漏了,可能会导致这种情况,某种软件可能会干扰?为什么我不能在一台有8.0GB内存的机器上分配700MB内存,这对我来说毫无意义。我


我还应该注意,没有其他正在运行的进程占用了我所有的RAM。这是Windows 7的新安装

您应该尝试使用64位Java运行时。可能的情况是,在您的计算机的32位地址空间(32位地址空间4GB)内没有985 MB的大型单片内存块可用。当您使用64位Java运行时时,Java可以在64位地址空间内分配内存,在64位地址空间中更可能有可用内存


JAR文件是使用32位版本构建的并不重要。

虽然700MB非常低,但这并不奇怪

Windows中的32位Windows XP仿真器与Windows XP的工作方式相同,但存在诸多限制。这意味着操作系统可能会丢失2GB或4GB。这意味着已经运行的程序会占用虚拟内存空间。此外,如果您的程序使用共享库或堆外存储(如直接内存和内存映射文件),这将意味着您丢失堆的虚拟内存。实际上,无论实际拥有多少内存,应用程序的虚拟内存都被限制为1.4 GB


解决这个问题的简单方法是使用64位JVM,该JVM在64位操作系统中运行,并且也受到限制,但Windows上的虚拟内存限制为192 TB。

您的问题的答案可能在于Windows试图找到足够大的连续内存块,但没有找到:请参阅。(尽管这表明其他进程正在占用内存,这似乎与您的上一句话相矛盾。)

您是否尝试过64位VM?尝试使用java x64版本java需要大量连续的虚拟内存用于堆,而32位Windows正与之斗争。@MZimmerman6这是简单的答案,我已经给出了更长的答案,为什么你真的不应该使用32位,除非你别无选择。遗留32位DLL是一个原因。@PeterLawrey看到问题是我不知道该.jar文件中是否有任何32位内容。它似乎不想使用64位运行在64位JVM上运行JAR时会收到什么错误消息?我不知道,当您运行32位版本的软件时,它必须模拟32位窗口,然后这就意味着limitations@MZimmerman6它必须这样做以确保最大的兼容性。