转载:https://blog.csdn.net/xiaocszn/article/details/83108058
当对java应用的内存和GC调优时,我们应该基于关键性能指标来做决定,但是指标有很多,哪些我们应该着重考虑呢?这篇文章将尝试讨论这个问题。
哪些是我们应该考虑的指标?
1. 吞吐量
2. 延迟
3. CPU消耗
1. 吞吐量
吞吐量是指单位时间内能完成的生产任务的量,首先我们得明确一下,什么是生产任务,什么是非生产任务?
生产任务:大部分时间在执行的业务任务
非生产任务:像GC等跟业务无关的任务
举个例子,假设你的应用跑了60分钟,其中2分钟在做GC操作,那么,应用有3.33%的时间在做GC(2/60),吞吐率是96.67%(100-3.33)。
现在问题来了,吞吐率多少是可接受的呢?这取决于我们的需求,一般来说吞吐率应该至少达到95%
2. 延迟
这个指标主要是指单次GC执行时长,应该从三个方面来考虑
a) 平均GC时长
b) 最大GC时长: 如果你负责的服务SLA(Service Level Agreements)是任何请求不超过10秒,那么你的最大GC停顿时长就不能超过10秒。因为在GC停顿时,整个JVM会暂停,任何业务代码都无法执行,因此所以最大GC停顿时间很重要。
c) GC时长分布
3. CPU消耗
CPU消耗会随着GC算法的不同和内存设置的不同而不同。有些GC算法比较消耗CPU(比如Parallel, CMS),而另一些算法比较节省CPU(比如Serial)
根据内存调优准则,以上这三个优化指标,你最多只能三者取其二
如果你想要比较好的吞吐量和延迟,那就得在CPU消耗上有所牺牲
如果你想要比较好的吞吐量和CPU消耗,那就得在延迟上有所牺牲
如果你想要比较好的延迟和CPU消耗,那就得在吞吐量上有所牺牲