我有一个应用程序在启动时使用以下命令请求特定数量的RAM。
java -Xms512m -Xmx985m -jar someJarfile.jar
此命令无法在具有8.0GB RAM的计算机上运行,因为它无法创建指定大小的对象堆。如果我将最大范围降低到700MB以下,它可以正常工作。
更奇怪的是,当java -Xmx768m -version
标志值超过700米时,即使做一个简单的-Xmx
也会失败。我试图用Java 1.7Uu67 32-bit
(就是用它构建的jar)以及更新版本的Java 1.7和事件Java 1.8来运行它。我会理解,如果最大堆更高,我使用32位,但它不高于~1.4GB的32位java上限
是否有一个配置参数,我错过了某个可能导致这种情况的配置参数,某种软件可能会干扰?对于我为什么不能在具有8.0GB RAM的机器上分配700MB RAM没有任何意义。我
我还应该注意,没有其他正在运行的进程占用了我所有的RAM。它是Windows 7的全新安装。
答案 0 :(得分:4)
虽然700 MB相当低,但这并不奇怪。
Windows中的32位Windows XP模拟器与Windows XP的工作方式相同,但有其局限性。这意味着您将失去2 GB或4 GB的可能性。这意味着已经运行的程序会占用虚拟内存空间。此外,如果您的程序使用共享库或关闭堆存储(如直接内存和内存映射文件),这将意味着您丢失了堆的虚拟内存。实际上,无论您实际拥有多少内存,都可以为应用程序限制1.4 GB的虚拟内存。
使用在64位操作系统中运行的64位JVM的简单方法也是有限的,但在Windows上却是192 TB的虚拟内存。
答案 1 :(得分:3)
您应该尝试使用64位Java运行时。可能的情况是,在计算机的32位地址空间内没有985 MB大的单片内存块(32位地址空间4GB)。当您使用64位Java运行时,Java可以在64位地址空间内分配内存,其中可用内存的可用性更高。
使用32位版本构建JAR文件并不重要。
答案 2 :(得分:2)
您的问题的答案可能在于Windows尝试并且无法找到足够大的连续内存块:请参阅http://javarevisited.blogspot.nl/2013/04/what-is-maximum-heap-size-for-32-bit-64-JVM-Java-memory.html。 (虽然这表明其他过程正在占用记忆,这似乎与你上次的评论相矛盾。)