3

我在运行我的应用程序时看到了一个 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。

任何想法?

4

3 回答 3

1

任何想法?

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

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

只需明确设置最大堆大小,您就不会遇到这个问题。


如果您想了解给定机器的默认堆大小,请运行以下命令:

java -XX:+PrintFlagsFinal -version 
于 2013-09-02T05:06:18.953 回答
0

您机器的堆大小取决于您拥有多少 RAM!

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

您不能使用 -Xmx JVM 堆选项将 4GB 设置为 32 位 JVM 的最大堆大小。您将收到无法创建 Java 虚拟机无效的最大堆大小:-Xmx 错误。

您可以在此处查找有关堆大小的详细解释文档。

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

于 2013-09-02T05:27:46.350 回答
0

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

(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
于 2016-03-22T01:05:33.920 回答