Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试分配超过128M个XM而未指定Xmx时出现JVM错误_Java_Jvm_Heap - Fatal编程技术网

Java 尝试分配超过128M个XM而未指定Xmx时出现JVM错误

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>

当我运行我的应用程序时,我看到一个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)
更有趣的是:以上所有命令在另一台具有相同操作系统(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