解决方法
当前的GC发生的频率和每次所花的时间还算正常,但是如果每次GC所花的CPU时间能减少,就能空出系统更多的能力处理任务池里的任务,用以降低任务池中的任务数,使得Q值基本上位于任务池的限额以下,这样可以提高在超负荷下业务请求的总的成功率。
当前Java Virtual Machine的配置为: Initial Heap Size:256 , Maximum Heap Size: 3072。相对而言, Maximum Heap Size设的有点偏大。对于不同的应用程序,最优化堆大小的设置都有可能不同。堆设置变大,GC的频率会降低,应用程序会运行更长的时间后,才会进行GC,带来的就是每次GC也会花更长的时间。从而GC调用占用系统更长的时间,使系统没有足够的能力处理请求,使得此刻任务池中的任务累积很多,Q值很大,形成很高的峰值,超过流量控制的限额,超过限额数的任务被流量控制给直接丢弃,从而导致总的成功率不高。
因此,必须降低堆大小,使得GC的频率增大,每次GC所花时间降低,从而降低Q的峰值,使之位于系统的流量控制的范围之内,从而提高业务请求的总的成功率。
当前的流量控制所允许的峰值是450,因此我们需要通过试验来验证,堆大小降低到什么值时,Q值的峰值将低于450,以保证总的成功率。 同时在峰值低于450的条件下,什么样的堆大小设置可以让系统的性能最佳。 因为如果堆设置过小,会使得对象可分配空间变小,从而会频繁的使用垃圾收集机制来释放内存空间,而每次垃圾收集,都会耗用一定的系统资源。所以,我们要通过试验和监控数据,设法使的我们所设置的堆大小能够使得我们的程序运行最优化。
通过多次试验,我们得出结论:当Java Virtual Machine的配置为: Initial Heap Size:512 , Maximum Heap Size: 1024时,该系统性能最佳。
从WebSphere Administrative Console上,依次点击Servers->Application Servers,然后选择需要的server,接着点击Process Definition->Java Virtual Machine,而后在那里设置Initial Heap Size:512和Maximum Heap Size: 1024。这时的配置对于该应用系统相对较为合理。这时再次分析3分钟内的GC的数据,从下图可以看出,GC的周期缩短了,每1-2秒就会发生一次GC,但是每次GC所花费的CPU时间降低了,平均130ms左右。
图五 改进JVM配置后的GC分析图
相应地,在JVM配置改进后,对任务池的Q值再进行一次采样,并且和改进前的采样值进行比价,采样图如下图六所示,改进后任务池的Q值分布在50-450之间,数值的起伏相对改进前要均衡些。不再出现忽然间Q值大小涨到500以上的情况,基本在流控的限制范围之类,进而提高了在超负荷下业务请求的总的成功率。
图六 改进JVM配置后和改进前的Q值采样比较图

