【JVM笔记】GC的吞吐量与暂停时间
吞吐量就是 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值,比如:虚拟机总共运行了 100 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是 99%这种情况下,应用程序能容忍较高的暂停时间,因此,高吞吐量的应用程序有更长的时间基准,快速响应是不必考虑的吞吐量优先,意味着在单位时间内,STW 的时间最短:0.2 + 0.2 = 0.4。...
目录
垃圾回收器分类
吞吐量(throughput)
吞吐量就是 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)
比如:虚拟机总共运行了 100 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是 99%
这种情况下,应用程序能容忍较高的暂停时间,因此,高吞吐量的应用程序有更长的时间基准,快速响应是不必考虑的
吞吐量优先,意味着在单位时间内,STW 的时间最短:0.2 + 0.2 = 0.4
暂停时间(pause time)
“暂停时间” 是指一个时间段内应用程序线程暂停,让 GC 线程执行的状态
例如,GC 期间 100 毫秒的暂停时间意味着在这 100 毫秒期间内没有应用程序线程是活动的
暂停时间优先,意味着尽可能让单次 STW 的时间最短:0.1+ 0.1+ 0.1 +0.1+0.1 = 0.5
吞吐量与暂停时间的对比
高吞吐量较好因为这会让应用程序的最终用户感觉只有应用程序线程在做 “生产性” 工作。直觉上,吞吐量越高程序运行越快
低暂停时间(低延迟)较好因为从最终用户的角度来看不管是 GC 还是其他原因导致一个应用被挂起始终是不好的。这取决于应用程序的类型,有时候甚至短暂的 200 毫秒暂停都可能打断终端用户体验。因此,具有低的较大暂停时间是非常重要的,特别是对于一个交互式应用程序
不幸的是 “高吞吐量” 和 “低暂停时间” 是一对相互竞争的目标(矛盾)
因为如果选择以吞吐量优先,那么必然需要降低内存回收的执行频率,但是这样会导致 GC 需要更长的暂停时间来执行内存回收
相反的,如果选择以低延迟优先为原则,那么为了降低每次执行内存回收时的暂停时间,也只能频繁地执行内存回收,但这又引起了年轻代内存的缩减和导致程序吞吐量的下降
在设计(或使用) GC算法时,我们必须确定我们的目标: 一个 GC 算法只可能针对两个目标之一(即只专注于较大吞吐量或最小暂停时间),或尝试找到一个二者的折衷
现在标准:在最大吞吐量优先的情况下,降低停顿时间
更多推荐
所有评论(0)