当我们在进行Java应用程序的内存和垃圾收集调优时,应该根据关键性能指标做出一系列的决定。但有大量的指标; 选择哪一个,抛弃哪一个?本文将解释内存调优正确的KPI。
内存调优的KPI包括: 吞吐量,响应时间和内存空间占用.
A. 吞吐量
吞吐量是指应用程序在给定的时间段内完成的生产性工作数量。这就带来了一个问题什么是生产性工作?非生产性的工作又是什么?
生产性工作: 应用程序在处理客户事务上花费的时间。
非生产性工作: 应用程序在程序本身事务管理工作(主要是垃圾收集)上花费的时间。
假设你的应用程序运行10分钟。在这10分钟里,假设1分钟用于GC活动。
这意味着应用程序在GC活动上花费了10%(即1 / 10 * 100)
这意味着应用程序吞吐量为90%(即100 - 10)。
现在的问题是:你可接受的吞吐量百分比是多少?它取决于应用程序和业务需求。通常,应该将目标设置为95%以上的吞吐量。
B. 响应时间
这是单个垃圾收集事件运行所花费的时间。这个指标应该从三个方面来研究。
平均GC时间:在GC上花费的平均时间是多少?
最大GC时间:在单个GC事件上花费的最大时间是多少?你的应用程序可能是服务级别协议,例如“任何事务都不能超过10秒”。在这种情况下,你的最大GC暂停时间不能运行10秒。因为在GC暂停期间,整个JVM会冻结——不会处理任何客户事务。因此,了解最大GC暂停时间非常重要。
GC时间分布:你还应该了解在什么时间范围内(即在0 - 1秒内完成300个GC事件,在1 - 2秒内完成20个GC事件…)
C. 内存空间占用
内存占用基本上就是CPU消耗的总量。基于你选择的GC算法和内存设置,CPU消耗将会有所不同。一些GC算法将消耗更多的CPU(如Parallel, CMS),而其他一些算法(如Serial)将消耗更少的CPU。
你一次只能选择其中的两个:
如果你想要良好的吞吐量和响应时间,那么内存占用就会变差。
如果你想要良好的吞吐量和占用空间,那么响应时间就会变差。
如果你想要好的响应时间和占用空间,那么吞吐量将会变差。
共同学习,写下你的评论
评论加载中...
作者其他优质文章