敏感的Xmx / GC默认为小堆的微服务

时间:2016-04-17 12:59:45

标签: java garbage-collection jvm

在我的公司,我们正在尝试使用基于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)?

2 个答案:

答案 0 :(得分:2)

提示#1: 做实验

假设您的微服务至少部署在两个节点上,在CMS上运行一个,在G1上运行另一个节点,并查看响应时间。

不太可能,但是如果你发现G1性能非常好,需要原始簇大小的一半呢?

附注:

  • re:“250Mb / s” - >如果所有这些都是堆栈记忆(或者,如果它是年轻的一代)那么G1将提供很少的好处,因为这些区域的收集是免费的。
  • re:“100 RPS” - >在许多情况下,我们发现减少系统中的并发请求(通过代理配置或应用程序容器级别)可以提高吞吐量。鉴于小堆,你很可能也有小的CPU数(2到4)。
  • 此外还有正式的Oracle Hints on tuning for a small memory footprint。它可能不会反映1.8_40上可用的最新配置,但无论如何它都是很好的阅读。

答案 1 :(得分:1)

测量完整GC后保留的内存量。添加到此每秒分配的内存量,并乘以2 - 10,具体取决于您希望有一个次要GC的频率。例如每2秒或每10秒钟。

E.g。假设你在完整的GC和GCing每隔几秒就保留了最多500 MB,你可以拥有500 MB + 2 * 250 MB,或大约1 GB的堆。

RPS的数量并不重要。