Java 尝试分配超过128M个XM而未指定Xmx时出现JVM错误
当我运行我的应用程序时,我看到一个JVM问题,我只是简单地使用以下java命令:Java 尝试分配超过128M个XM而未指定Xmx时出现JVM错误,java,jvm,heap,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>
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)
更有趣的是:以上所有命令在另一台具有相同操作系统(WindowsServer2008R2企业版SP1)和相同jdk版本的机器上运行良好。物理内存为16GB
有什么想法吗
有什么想法吗
显而易见的结论是,如果要使用-Xms指定初始堆大小,并且要将大小设置为大于默认最大堆大小的值,则需要指定最大堆大小
在不同的机器上得到不同结果的原因是JVM以不同的方式计算默认堆大小,这取决于Java版本和执行平台。在某些情况下,它是一个常数。在其他情况下,它取决于系统上的物理内存量
只需显式设置最大堆大小,就不会有这个问题
如果要了解给定计算机的默认堆大小,请运行以下命令:
java -XX:+PrintFlagsFinal -version
机器的堆大小取决于的不仅仅是内存的多少 32位或64位JVM的最大堆大小看起来很容易确定 查看32位JVM的可寻址内存空间,如2^32(4GB)和 2^64用于64位JVM 对于32位JVM,不能使用 -Xmx JVM堆选项。您将获得无法创建Java虚拟机的无效最大堆大小:-Xmx错误 您可以查找关于堆大小的详细说明文档
另一件重要的事情是,您只能通过增加堆大小来推迟
OutofMemory
异常。除非您清理内存,否则您会有一次或另一次出现异常使用像Visual VM这样的应用程序来了解后台发生了什么。我建议您尝试优化代码,以提高性能。我也有同样的问题。我现在仍在调试它,但它似乎与默认的MaxHeapSize
设置为TOTALRAM/4或(16GB/4=4GB=2^32)有关:
我从-XX:PrintFlagsFinal
获得以下输出:
uintx MaxHeapSize := 0 {product}
同时,-XX:+PrintCommandLineFlags
的输出也确认4G值:
-XX:InitialHeapSize=268428160 -XX:MaxHeapSize=4294850560 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
谢谢,斯蒂芬。问题出在“故障”机器上,它是一个64位操作系统,具有16GB的物理内存。我个人认为设置Xms128m不应该有任何问题,因为默认的Xmx不应该小于128M。只是澄清一下:“故障”机器和“无故障”机器都运行64位Windows Server 2008 R2 Enterprise 64位,具有16GB物理内存。很明显,它“有问题”。。。不管你认为应该还是不应该。如果您对我的解释不满意,我建议您通过Java支持合同询问Oracle。。。或者下载OpenJDK 6源代码,并尝试找出实际发生的情况。告诉我们你认为“不应该发生”是。。。好。。。没有意义,因为它显然发生了。嗯,请不要误会我。你的评论真的很有帮助,我只是好奇为什么两台机器的工作方式不同。好的方面是:我使用JDK的更新版本(1.6_17不支持此选项)运行带有-XX:+PrintFlagsFinal的命令,结果让我吃惊。“故障”机器显示“uintx MaxHeapSize:=0{product}”,而“良好”机器显示“uintx MaxHeapSize:=4160749568{product}”。现在看起来很棘手。。。为什么MaxHeapSize在出现问题的机器上是零?我猜,但是可能有一些操作系统设置(访问控制?安全性?)阻止JVM发现“出现问题”的机器上有多少物理内存。谢谢,Dileep。正如我对Stephen所说,“故障”和“无故障”机器都是Windows Server 2008 R2 Enterprise 64位,具有16GB物理内存。只是想知道为什么设置Xms128m不起作用,因为默认分配的Xmx在16GB物理内存上应该肯定大于128m。@晓峰向上投票,如果您对我的答案满意,请接受答案:)
-XX:InitialHeapSize=268428160 -XX:MaxHeapSize=4294850560 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC