为什么启用 G1 垃圾收集器时最大堆大小不正确?

Why max heap size is incorrect when I enable G1 garbage collector?

当我使用 -Xmx=1024m -XX:+UseG1GC 在 java 应用程序中启用 G1 时。并使用 jvisualvm 命令检查最大堆大小。最大堆大小为 2GB 而不是 1GB。

有人知道为什么吗?

JVM 从 OS 分配的堆内存多于使用量。
考虑到性能,分配内存是一项繁重的操作。
所以 JVM 总是在它需要的时候分配额外的内存。

Java 还为其他事情分配内存,包括为每个线程分配一个堆栈。 VM的总内存消耗超过-Xmx的值并不罕见。

JVM 维护两个内存区域,Java™ 堆和本机(或系统)堆。这两个堆有不同的用途,由不同的机制维护。

Java 堆包含 Java 个对象的实例,通常称为 'the heap'。 Garbage Collection维护的是Java堆,命令行堆设置改变的是Java堆。 Java 堆使用 mmap 分配,如果需要大页面支持,则使用 shmat。 Java 堆的最大大小在 JVM 启动期间作为一个连续区域预先分配,即使最小堆大小设置较低也是如此。

native,也就是系统堆,是通过操作系统底层的malloc和free机制分配的,用于特定Java对象的底层实现;例如:

1) 由即时 (JIT) 编译器生成的编译代码
2) 要映射到 Java 个线程

的线程

jvisualvm 正在向您展示 java 堆+系统堆。而 -Xmx 参数只影响 java 堆。
Link: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_5.0.0/com.ibm.java.doc.diagnostics.50/diag/problem_determination/aix_mem_heaps.html