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

问题描述

以下是一些信息:

  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 情况下:垃圾收集(主动)1808M(11%)->166M(1%)

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

  1. The Java ZGC garbage collector USES a lot of memory
  2. ZGC maxheap size exceed physical memory
  3. Why is my Java heap dump size much smaller than used memory?

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...