问题描述
以下是一些信息:
- Linux 版本 3.18.6-2.el7.centos.x86_64、openjdk-11.0.2
- 使用 ZGC 和 -xms16384M -Xmx16384M
- top 命令显示:17.013t VIRT、0.016t RES、0.015t SHR、35.2 %cpu、13.0%MEM
- 堆转储大小为 83M(使用 jcmd 命令)
- VisualVM 摘要显示堆大小为 55M
- 在大多数 GC 情况下:垃圾收集(主动)1808M(11%)->166M(1%)
- The Java ZGC garbage collector USES a lot of memory
- ZGC maxheap size exceed physical memory
- Why is my Java heap dump size much smaller than used memory?
解决方法
我不确定第 6 点到底是什么,如果您显示垃圾收集器日志文件中的几行会更有帮助。我也不使用 VisualVM,因此无法对此发表评论。
所以这个答案主要是猜测。
JVM 使用的内存被划分为不同的区域,最重要的是你有一个堆和一个栈。但是您仍然会看到堆将比您使用 -Xmx 配置的更大,因为有一个称为 Metaspace(或旧 JVM 中的永久代)的区域,它保存静态信息,例如类或源代码中的字符串文字。元空间位于“正常”堆的顶部。我的猜测是,有些工具将其计入堆,有些则不计。这可能是您获得不同数字的地方。