我们在进行GC调优的过程中,经常是发现出现问题后(比如OOM或者应用长时间暂停),再进行调优的过程。能不能做到在问题出现之前,就先进行调优呢?让我们来给GC算算卦吧!
首先,我们需要拿到一些系统运行状况才能推算出GC的情况,比如:
- 系统内存大小
- 系统高峰时的TPS/QPS
- 高峰时平均每个请求的耗时
根据这些数据,就可以开始“算命”了(以下是我针对某个线上应用的推算过程):
- 系统每秒钟分配的内存大小:因为新分配的内存都是放在EdenSpace的,所以我们可以根据jstat的观测推算出这个值来(jstat -gcutil [pid] 1000)。 多次观测取Eden的差值平均(排除GC前后的),既可以算出Eden在一秒钟内的内存增长比例,再根据jmap -heap(
这样就可以将系统的QPS和内存的分配频率、分配大小结合在一起,通过一些监控,就可以实现当QPS到达一定值时,就要准备做性能调优或对服务器扩容了。当然,系统的内存分配监控可能不是这么简单的,系统每个请求的耗时、系统版本更新、外部资源的变更等可能都会导致系统内存分配的变化,所以这种“算命”只是针对稳态系统的情况下的一种测算方法。
转载请注明出处: http://blueswind8306.iteye.com/blog/1217770