[ZGC]为什么使用的内存比转储文件大很多?

[ZGC]Why the memory used is much larger than the dump file?

这里有一些信息:

  1. Linux版本3.18.6-2.el7.centos.x86_64、openjdk-11.0.2
  2. 使用 ZGC 和 -Xms16384M -Xmx16384M
  3. top 命令显示:17.013t VIRT、0.016t RES、0.015t SHR、35.2%CPU、13.0%MEM
  4. 堆转储大小为 83M(使用 jcmd 命令)
  5. VisualVM 摘要显示堆大小为 55M
  6. 在大多数 GC situations:Garbage 收集(主动)1808M(11%)->166M(1%)

我已经搜索并阅读了以下答案,但仍然无法解决我的疑惑。

  1. The Java ZGC garbage collector USES a lot of memory
  2. ZGC maxheap size exceed physical memory

我不确定第 6 点到底是什么,如果您显示垃圾收集器日志文件中的几行内容会更有帮助。我也不使用 VisualVM,所以无法对此发表评论。

所以这个答案主要是猜测。

JVM使用的内存被分成不同的区域,最重要的是你有一个堆和一个栈。但是您仍然会看到堆将比您使用 -Xmx 配置的更大,因为有一个名为元空间(或旧 JVM 中的永久生成)的区域保存静态信息,例如 类 或例如来自您的字符串文字源代码。元空间位于“正常”堆的顶部。我的猜测是有些工具将其计入堆,有些则不计。这可能是您从中获得不同数字的地方。