尝试分配超过128M Xms时的JVM错误,而不指定Xmx

时间:2013-09-02 04:45:28

标签: java jvm heap

我在运行应用程序时看到JVM问题而我只是在java命令下面看到了

C:\Users\optitest>I:\j2sdk\bin\java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

C:\Users\optitest>I:\j2sdk\bin\java -Xms4g -version
Error occurred during initialization of VM
Incompatible minimum and maximum heap sizes specified

即使Xms设置为128M也不起作用:

C:\Users\optitest>I:\j2sdk\bin\java -Xms128m -version
Error occurred during initialization of VM
Incompatible minimum and maximum heap sizes specified

仅当Xms设置为64M或更低时才有效:

C:\Users\optitest>I:\j2sdk\bin\java -Xms64m -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

有趣的是,如果我指定Xmx,那么它运作良好。

C:\Users\optitest>I:\j2sdk\bin\java -Xms4g -Xmx4g-version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

C:\Users\optitest>I:\j2sdk\bin\java -Xms4g -Xmx8g-version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

更有趣的是:以上所有命令在具有相同操作系统的另一台机器上运行良好(Windows Server 2008 R2 Enterprise SP1)&相同的jdk版本。物理内存为16GB。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

  

有什么想法吗?

明显的结论是,如果要使用-Xms指定初始堆大小,并且希望将大小设置为大于默认最大堆大小的值,您需要指定最大堆大小。

您在不同计算机上获得不同结果的原因是JVM以不同方式计算默认堆大小,具体取决于Java的版本和执行平台。在某些情况下,它是一个常数。在其他情况下,它取决于系统上的物理内存量。

只需明确设置最大堆大小,就不会出现此问题。


如果要查找给定计算机的默认堆大小,请运行以下命令:

java -XX:+PrintFlagsFinal -version 

答案 1 :(得分:0)

你机器的堆大小取决于你获得多少RAM!

  

32位或64位JVM的最大堆大小看起来很容易确定   查看可寻址的内存空间,如2 ^ 32(4GB),用于32位JVM和   对于64位JVM,为2 ^ 64。

     

对于使用32位JVM的最大堆大小,您无法真正设置4GB   -Xmx JVM堆选项。您将无法创建Java虚拟机无效的最大堆大小:-Xmx错误。

您可以查看here以获取有关堆大小的详细解释文档。

另一个重要的事情是,您只能通过增加堆大小来推迟OutofMemory例外。除非你清理你的记忆,否则你会得到一次或另外的例外使用 Visual VM 等应用程序来了解后台发生的事情。我建议您尝试优化代码,以提高性能。

答案 2 :(得分:0)

我有同样的问题。我现在还在调试它,但似乎它可能与设置为TOTALRAM / 4或(16GB / 4 = 4GB = 2 ^ 32)的默认MaxHeapSize有关:

(uint32) 2^32 = 0

我从-XX:PrintFlagsFinal得到以下输出:

uintx MaxHeapSize                              := 0               {product}

-XX:+PrintCommandLineFlags的输出也确认了4G值:

-XX:InitialHeapSize=268428160 -XX:MaxHeapSize=4294850560 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC