6

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

有人知道为什么吗?

4

1 回答 1

3

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

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

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

Java 堆包含 Java 对象的实例,通常被称为“堆”。垃圾收集维护的是 Java 堆,命令行堆设置更改的是 Java 堆。如果需要大页面支持,则使用 mmap 或 shmat 分配 Java 堆。Java 堆的最大大小在 JVM 启动期间被预先分配为一个连续区域,即使最小堆大小设置较低也是如此。

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

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

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

于 2015-08-12T03:52:55.950 回答