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

6
当我在Java应用程序中启用G1并使用-Xmx=1024m -XX:+UseG1GC命令时,使用jvisualvm命令检查最大堆大小。最大堆大小为2GB而不是1GB。有人知道原因吗?
1个回答

3
JVM分配给操作系统的堆内存比实际使用的要多。由于性能考虑,分配内存是一个繁重的操作,因此JVM总是会分配比它需要的更多的内存。
Java还为其他事物分配内存,包括每个线程的堆栈。虚拟机的总内存消耗超过-Xmx值并不罕见。
JVM维护两个内存区域,即Java堆和本地(或系统)堆。这两个堆具有不同的目的,并由不同的机制维护。
Java堆包含Java对象的实例,通常称为“堆”。垃圾回收器维护Java堆,命令行堆设置更改Java堆。Java堆使用mmap进行分配,如果请求大页面支持,则使用shmat进行分配。即使最小堆大小设置较低,Java堆的最大大小也在JVM启动期间预先分配为一个连续的区域。
本地或系统堆通过使用操作系统的底层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

2
我不这么认为。因为当我更改-Xmx=4096m时,最大堆大小为8GB,堆大小为0.7GB,已使用的堆大小为0.5GB。 - huuphongdn2009
1
当我使用jconsole进行检查时,最大堆大小是正确的。 - huuphongdn2009

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接