今天遇到一个这样的问题
在启动JVM时提示“ 无效的初始堆大小:-Xms = 1024M ”,甚至在将最大堆大小从1024 m更改为512M之后,它仍然崩溃,提示的错误是“无效的初始堆大小:-Xms = 512M,无法创建的Java虚拟机“。
我检查了几乎所有的东西,从检查我的机器有多少物理内存到JVM参数中的任何类型的错误,结果发现我把MB放进去了,而不是M.
。爪哇同时接受小的案和用于基洛,米加和演出的大写案例你可以使用米或M,G或G ^等,但不能使用MB,GB或KB。
使用-Xmx指定的最大堆大小也可能出现类似的问题。同样从Java 6更新18开始,JVM中的默认堆大小也发生了变化。
JVM中的初始和最大堆大小无效
以下是在Java的的中指定最大和最小堆大小时常见的错误列表:
java - xmx4056 - xms4056 - HelloWorld
问题:VM初始化过程中发生错误,对象堆+ VM数据的大小超过了可表示的最大大小
原因:-Xms或-Xmx的值大于或接近物理内存的大小,因为我的机器有4GB内存。
java -Xmx1056M -Xms2056M HelloWorld
问题:VM初始化期间发生错误,指定的最小和最大堆大小不兼容
原因:-Xms的值大于-Xmx
java -Xms2056M HelloWorld
问题:VM初始化过程中发生错误,无法为对象堆预留足够的空间
原因:只提供-Xms,不提供-Xmx如果你犯了一个错误,而不是-Xmx你指定了两次-Xms,你也会得到这个错误,上次发生在我的朋友身上。
命令:java -Xms1024 M -Xmx1024M HelloWorld
问题:VM初始化时发生错误,初始堆太小
原因:如果您的空间在1024和中号之间,那么JVM会假设-Xms的大小仅为1024字节,并且打印错误认为它太小,JVM无法启动。
无效的堆大小
重新启动JVM时出现“无效堆大小”问题的另一个场景是,将64位JVM配置为接受内存超过4GB,但运行在32位数据模型上的内存。这种“无效堆大小”特别出现在的的Solaris机器中,J2SE安装持续32位和64位J2SE实现。在窗口和Linux等其他环境中,32位和64位JVM分别安装。如果不指定-d32或-d64,安装在的的Solaris机器上的64位JVM将运行32位模型,这将不接受4GB的最大堆大小,因此“无效堆大小”。
您可以通过使用选项-d64运行Solaris JVM来解决这个问题。命令行选项允许JVM在可用的情况下使用64位数据模型。
公共类HelloWorld {
public static void main(String args []){
System.out.println(“HelloWorld to Java”);
}
}
$ test @ nykdev32:~java -version
java版“1.6.0_14”
Java(TM)SE运行时环境(版本1.6.0_14-b08)
Java HotSpot(TM)服务器VM(内置14.0-b16,混合模式)
$ test @ nykdev32:~java -Xmx4096M HelloWorld
最大堆大小无效:-Xmx4096M
指定的大小超出了最大可表示大小。
无法创建Java虚拟机。
$ test @ nykdev32:~java -d64 -Xmx4096M HelloWorld
HelloWorld到Java
如果你从命令行运行的Java程序,你得到无法创建的Java虚拟机的错误消息,以及无效堆的错误,但如果你从Eclipse的中运行程序,你就不会得到“无法创建的Java虚拟机“的消息,你只会看到控制台的错误信息。
关于Java中的默认堆大小,从Java 6更新18开始,JVM在32位和64位机器以及客户机和服务器JVM模式下计算默认堆大小的方式发生了重大变化:
1)初始堆空间和最大堆空间越大,性能越好。
2)默认最大堆空间大小为192字节的物理内存的1 /,所以对于1G机器,堆的最大大小是256MB。在程序创建足够的对象来填充初始堆空间之前,不会使用最大堆大小,初始堆空间要小得多,但至少为8MB,即物理内存的1/64,最大1G。
3)对于服务器的Java的虚拟机,32位JVM上4GB物理内存的默认最大堆空间为1G。对于64位JVM,物理内存为128GB,则为32G。