这是我参与更文挑战的第 27 天,活动详情查看: 更文挑战
GC分类与性能指标
分类
- 按线程分:可分为串行垃圾回收器和并行垃圾回收器。
- 串行:同一时间内只允许有一个CPU执行垃圾回收操作,工作线程被暂停。
- 并行:允许多个CPU执行垃圾回收操作,提升程序吞吐量。
- 按工作模式分:可以分为并发式垃圾回收器和独占式垃圾回收器。
- 并发式:垃圾回收器与程序线程交替工作,尽可能减少程序的停顿时间。
- 独占式:一旦运行就停止程序中所有用户线程,直至垃圾回收结束。
- 按碎片处理方式分:可分为压缩垃圾回收器和非压缩垃圾回收器。
- 压缩式垃圾回收:回收完成后会对存活对象进行压缩整理,清除回收后的碎片。使用指针碰撞的方式再分配对象空间使用。
- 非压缩式垃圾回收:没有压缩式垃圾回收器的步骤。使用空闲列表方式再分配对象空间使用。
- 按工作的内存空间分:可分为年轻代和老年代的垃圾回收器。
性能指标
- 吞吐量:运行用户代码的时间占总时间的比例。总运行时间=程序运行时间+垃圾回收的时间
- 垃圾收集开销:吞吐量的补数,垃圾回收所占用的时间与总运行时间的比例。
- 暂停时间(STW):执行垃圾回收的时候,程序工作线程被暂停的时间。
- 收集频率:相当于应用程序的执行,收集操作发生的频率。
- 内存占用:Java堆区占用内存大小。
- 快速:一个对象从诞生到被回收的时间。
主要的指标是吞吐量、暂停时间和内存占用,通常这三种特性无法全部满足,一款优秀的垃圾回收器最多同时满足其中两项。暂停时间的重要性逐渐突出,因为随着硬件内存的扩大,提高了吞吐量,但是对低延迟带来负面效果。所以,吞吐量和暂停时间是最主要的主标。
吞吐量和暂停时间
高吞吐量较好是因为应用程序最终的用户觉得只有应用程序线程在工作,直觉上,吞吐量越高程序运行越快。
低暂停时间(低延迟)较好是因为从最终用户的角度来看不够是GC还是其他原因导致一个应用被挂起始终是不好的。对于一个交互式应用,具有较低的暂停时间非常重要。
但是高吞吐量和低暂停时间是互相竞争的:
- 如果选择吞吐量优先,那么必然降低内存回收的频率,但是这样会导致GC需要暂停更长的时间来执行回收。
- 如果选择低延迟优先,那么为了降低每次执行回收的暂停时间,只能**频繁的执行内存回收,**从而导致年轻代内存缩减和吞吐量下降。
一个垃圾回收算法只能针对二者之一,或找到一个折中点。目前所使用的G1垃圾回收器的特点是,在最大吞吐量优先的情况下,降低停顿时间。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END