Java 为什么将-Xmx设置得太高有时会导致JVM失败,即使存在';有可用的内存吗?

Java 为什么将-Xmx设置得太高有时会导致JVM失败,即使存在';有可用的内存吗?,java,jvm,jvm-arguments,heap-size,Java,Jvm,Jvm Arguments,Heap Size,基本上,我们已经注意到,在一些计算机上设置JVM选项-Xmx(最大堆大小)有时会导致JVM无法初始化,即使系统上有足够的RAM 例如,在4gb机器上,我们有-Xmx1024m,它失败了,但-Xmx800m可以工作。在1gb机器上,甚至2gb机器上,我都能理解,但在4gb机器上,特别是考虑到Windows、Linux等可以交换RAM,为什么会失败 我看到很多线程和问题都在说要减少最大堆大小,但没有人能解释它为什么失败,这正是我真正想要的 同样,您如何说,在达到某个特定大小时,您需要消耗尽可能多的内

基本上,我们已经注意到,在一些计算机上设置JVM选项-Xmx(最大堆大小)有时会导致JVM无法初始化,即使系统上有足够的RAM

例如,在4gb机器上,我们有-Xmx1024m,它失败了,但-Xmx800m可以工作。在1gb机器上,甚至2gb机器上,我都能理解,但在4gb机器上,特别是考虑到Windows、Linux等可以交换RAM,为什么会失败

我看到很多线程和问题都在说要减少最大堆大小,但没有人能解释它为什么失败,这正是我真正想要的


同样,您如何说,在达到某个特定大小时,您需要消耗尽可能多的内存?

这可能是由于。可能无法为堆的最大潜在大小保留连续的1024MB地址范围,这取决于DLL的加载地址、线程的堆栈位置、不可移动的本机内存分配、内核保留地址等,尤其是在32位进程中。

。其中一台XP机器我可以分配1400MB,而其他的只有1200MB。正如Jeffrey Hantin在另一个答案中所说,一致的意见是碎片化。

快速搜索会让用户感到惊讶,因为JVM允许他们将
-Xmx
设置为TB,即使他们没有那么多交换空间。您能分享您测试的确切命令和JVM版本吗?@alf,请记住,
-Xmx
设置最大堆大小,这只是虚拟地址空间保留范围的大小;只有在
-Xms
中指定的数量才由提交的存储实际支持。例如,查看并比较
MEM_RESERVE
MEM_COMMIT
标志。@JeffreyHantin我知道,Jeffrey,我知道。这就是为什么我问OP到底做了什么,Oracle的JDK 6。但是我想一个更好的问题是,你怎么说需要多少内存?@StephaneGrenier标准JRE不能通过分配新的地址空间来自动增长堆——它必须预先分配整个堆地址范围(
-Xmx
值),但只会根据需要将RAM和/或交换的实际页面映射到该地址空间(从
-Xms
值开始)。这是优化带来的实现限制——它允许垃圾收集器将整个Java堆视为一个巨大的数组。