为什么-Omx12m出现OutOfMemoryError而不是-Xmx13m?

use*_*093 5 java heap-memory out-of-memory

为什么我通过以下方式执行下面的类:java -Xmx12m OOM它失败并显示java.lang.OutOfMemoryError Java heap space消息.但如果它适用java -Xmx13m OOM.

class OOM {
  static final int SIZE=2*1024*1024;
  public static void main(String[] a) {
    int[] i = new int[SIZE];
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为int是4字节所以2*1024*1024*4 = 8,388,608bytes.它还低于12,对吧?那怎么会-Xmx12m失败但是-Xmx13m有效?

Ste*_*n C 4

一个-Xmx选项设置总(最大)堆大小。然而,Java 堆通常由 2 个(或更多)空间1组成,并且 Java 对象必须适合单个空间。

当您将堆设置为 12mb 时,两个空间都不足以容纳约 8mb 的单个对象。当您将总堆大小增加到 13mb 时,其中一个空间就足够大了。


1 - “new”或“eden”空间是通常分配新对象的地方。“旧”或“终身”空间是对象在经过一定数量的 GC 周期后最终所处的位置。但是,非常大的对象(例如您的对象)可能会直接分配到“旧”空间中。(注意:这是一个简化......)

2 - 可以调整新空间的相对大小,但这会产生其他后果。例如,如果您将新空间的大小减少太多,则可能会增加“完整”GC 的百分比……这会影响吞吐量和 GC 暂停。