背景
手头有一个流式计算项目,特点是高吞吐且对延时敏感,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倍。
针对一个高吞吐、低延迟的流式计算项目,原有的G1GC在高峰时段引发长时间停顿。转向JDK11的ZGC后,虽然成功减少了STW时间,但在使用top命令观察时,发现程序%MEM超过100%。经研究,这可能源于ZGC的指针染色技术,导致内存占用显示为堆大小的三倍。通过调整和理解ZGC的工作原理,可以更好地优化内存管理和性能。
1195

被折叠的 条评论
为什么被折叠?



