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

时间:2015-08-12 03:46:57

标签: java garbage-collection heap-size g1gc

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

有人知道为什么吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

Java堆包含Java对象的实例,通常称为“堆”'。它是由Garbage Collection维护的Java堆,它是由命令行堆设置更改的Java堆。如果请求大页面支持,则使用mmap或shmat分配Java堆。在JVM启动期间,Java堆的最大大小将作为一个连续区域预先分配,即使最小堆大小设置较低。

本机或系统堆是使用操作系统的底层malloc和free机制分配的,用于特定Java对象的底层实现;例如:

1)Just In Time(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