Java JVM堆大小

4

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

java -Xms512m -Xmx985m -jar someJarfile.jar

这个命令在我拥有8.0GB内存的电脑上无法运行,因为它不能创建指定大小的对象堆。如果我将最大范围降低到700MB以下,就可以正常运行。更奇怪的是,即使只是简单地执行java -Xmx768m -version,当-Xmx标志值超过700m时也会失败。我试图在我的电脑上使用Java 1.7Uu67 32位版(这就是jar文件构建的版本),甚至是更新的Java 1.7和Java 1.8版本。如果最大堆高于32位Java的约1.4GB限制,而我又使用了32位,则我会理解,但实际上并未超过该限制。是否存在某些配置参数或软件干扰导致此问题?对我来说,无法在拥有8.0GB内存的机器上分配700MB RAM没有任何意义。我还应该注意到,没有其他正在运行的进程占用所有内存。这是一个全新的Windows 7安装。

1
你尝试过64位虚拟机吗? - the8472
1
尝试使用Java x64版本。 - Jorge Campos
1
Java需要一个大的虚拟内存连续区域来存储堆,而32位Windows无法满足这个需求。 - Alan Stokes
3个回答

4
尽管700 MB相对较低,但并不令人意外。在Windows中的32位Windows XP模拟器与Windows XP相同,具有所有限制。这意味着您会失去2 GB或潜在4 GB作为操作系统。这意味着已经运行的程序占用虚拟内存空间。如果您的程序使用共享库或离堆存储,例如直接内存和内存映射文件,则意味着您将损失堆(heap)的虚拟内存。实际上,无论您实际拥有多少内存,您的应用程序都被限制在1.4 GB的虚拟内存中。解决这个问题的简单方法是使用64位JVM,在64位操作系统中运行,并受到限制,但在Windows上的虚拟内存限制为192 TB。

我之前并不知道,当你运行一个32位软件时,它必须模拟32位Windows,这会带来一些限制。 - MZimmerman6
@MZimmerman6 这样做是为了确保最大程度的兼容性。 - Peter Lawrey

3
你应该尝试使用64位Java运行时环境。很可能你的计算机32位地址空间(4GB)中没有985MB大的一整块空闲内存。当你使用64位Java运行时环境,Java可以在64位地址空间内分配内存,其中可用的自由内存更有可能存在。
不要担心你的JAR文件是使用32位版本构建的。

@MZimmerman6 这是简短的答案,我已经给出了更长的答案,为什么你真的不应该使用32位,除非你别无选择。遗留的32位DLL是其中一个原因。 - Peter Lawrey
@PeterLawrey,问题在于我不知道那个.jar文件中是否有任何32位的内容。它似乎不想在64位上运行。 - MZimmerman6
尝试在64位JVM上运行JAR文件时,您会收到什么错误信息? - Bob

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接