当我在-Xmx=1024m -XX:+UseG1GC
的java应用程序中启用G1时。并使用jvisualvm
命令检查最大堆大小。最大堆大小为2GB而不是1GB。
有人知道为什么吗?
答案 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