背景
手头有一个流式计算项目,特点是高吞吐且对延时敏感,heap大小在50G左右,原先使用的G1GC在高峰期的gc时间长达30s以上,对下游业务造成了干扰。
经过多次调优,仍然不理想,因此尝试使用JDK11的ZGC优化performance。经过初步试运行,ZGC在同样吞吐量的情况下,能够有效缩减STW时间,提升效率。
但运行中发现一个问题,当我们使用top命令查看程序运行情况时,发现如下的现象,程序占用的%MEM超过了100。
原因
由于程序运行正常,操作系统也没有运行其它程序,因此我们猜测可能是ZGC相关的特性导致了这一反常现象的出现。
通过搜索,找到如下解释:
https://stackoverflow.com/questions/57899020/zgc-max-heap-size-exceed-physical-memory
https://stackoverflow.com/questions/62926652/the-java-zgc-garbage-collector-uses-a-lot-of-memory
简单来说,zgc采用了指针染色技术以提升gc效率,对于堆内存有三种view("marked0", "marked1", "remapped"),因此使用top查看的内存大小约为jvm堆大小的3倍。