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

标签 java garbage-collection heap-size g1gc

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

有人知道为什么吗?

最佳答案

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

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

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

Java 堆包含 Java 对象的实例,通常称为“堆”。由Garbage Collection维护的是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

关于java - 为什么启用 G1 垃圾收集器时最大堆大小不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955666/

相关文章:

java - 在 java swing 应用程序中嵌入 map

java - 反转文件的句子、行和单词

java - 是否存在不受垃圾回收影响的对象?

garbage-collection - 我怎么知道谁在 spark streaming 程序中调用了 System.gc()?

linux - 如何检查linux为jvm分配的堆大小

java - 即使将堆大小增加到最大值后,Jmeter 也会出现超过 2000 个线程的 java.lang.OutOfMemoryError

java - 保护条件可以是方法调用吗?

java - 如何删除火力基地数据库中的一项项目?

java - 为什么会发生 Full GC Continuous?