@
esolve 一般都是先根据硬件情况大致测算出不同堆内存的 Full GC 的停顿时间,一般应用是不允许 GC 停顿超过 1.5 秒,否则就会影响上层业务,在 1.5 秒这个范畴内去设置合理的堆内存,一般硬件上也就三四个 G 的样子, 解决 STW 的问题主要还是靠单机多进程集群的方式,比如你有 32G 的内存可以分配给 JVM 进程,如果你把这些内存一次性分配给一个 JVM 进程,那么一旦产生 FULL GC,应用可能直接停顿半分钟以上甚至一分钟,这绝对是无法接受的,所以通常应该多起几个 JVM 进程,每个进程发生 FULL GC 的时候都要控制在 1.5 秒这个范畴内,这样才不会对上层业务产生影响,开 8 个 JVM 进程每个 4G 内存 1.5 秒 FULL GC 时间明显要比单个进程 32G 内存 1 分钟 FULL GC 好的多,我说的这些都是针对停顿时间敏感的业务比如高并发的 web 应用和 API 服务,如果对停顿时间不敏感也可以只开一个进程,比如后台跑算法啊批处理作业啊爬虫啊什么的就无所谓停顿多长时间了,因为即便是 FULL GC 一次十分钟,我们也是可以接受的