在我的公司,我们正在尝试使用基于JVM的微服务。它们被设计为水平扩展,因此我们使用相当小的容器(最多2G堆,通常1-1.5G)运行每个实例的多个实例。我们使用的JVM是1.8.0_40-b25。
每个此类实例通常最多可处理100 RPS,最大内存分配率约为250 MB / s。
问题是:什么样的GC可能是一个明智的默认开始?到目前为止,我们使用CMS与Xms = Xmx(以避免在堆大小调整期间暂停)和Xms = Xmx = 1.5G。结果很不错 - 我们几乎没有看到任何主要的GC。
我知道G1可以给我更小的停顿(以总吞吐量为代价)但是AFAIK需要更多的呼吸和#34;空间和至少3-4G堆正常执行。
任何提示(除了去找Azul' Zing:D)?
答案 0 :(得分:2)
提示#1: 做实验 !
假设您的微服务至少部署在两个节点上,在CMS上运行一个,在G1上运行另一个节点,并查看响应时间。
不太可能,但是如果你发现G1性能非常好,需要原始簇大小的一半呢?
附注:
答案 1 :(得分:1)
测量完整GC后保留的内存量。添加到此每秒分配的内存量,并乘以2 - 10,具体取决于您希望有一个次要GC的频率。例如每2秒或每10秒钟。
E.g。假设你在完整的GC和GCing每隔几秒就保留了最多500 MB,你可以拥有500 MB + 2 * 250 MB,或大约1 GB的堆。
RPS的数量并不重要。