1. 垃圾回收器的分类
1.1 按垃圾回收线程分
按垃圾回收的线程分,分为串行垃圾回收器(Serial)和并行垃圾回收器(Parallel)
1.1.1 串行垃圾回收器(Serial Collector)
顾名思义,串行垃圾回收器是只有一个垃圾回收线程工作的垃圾回收器.
串行垃圾回收器的应用场景就是使用 jvm Client模式(64位jdk默认Server)的时候,会使用串行垃圾回收器.
当jvm运行的环境处理器资源较少时,会使用此垃圾回收器,并且此时相较于并行垃圾回收器,效率更高.
1.1.2 并行垃圾回收器(Parallel Collector)
并行垃圾回收器就是多个垃圾回收线程同时工作
1.2 按工作模式划分
按工作模式可以划分为并发式垃圾回收器和独占式垃圾回收器
1.2.1 并发式垃圾回收器
并发与并行的区别,我们之前已经谈过.
并发式垃圾回收器是指垃圾回收线程和程序线程交替执行,这样的好处是降低了STW的时间,减少程序的延时,缺点也很明显,交替执行增加系统资源开销
1.2.2 独占式垃圾回收器
顾名思义,独占式就是垃圾回收线程工作的时候,程序线程全部停止,等待垃圾回收线程完成回收工作后才能继续运行,即STW事件.
1.3 按内存碎片的整理方式划分
分为压缩式垃圾回收器和非压缩式垃圾回收器
1.3.1 压缩式垃圾回收器
之前谈到垃圾回收算法的时候提到过,标记-清除-压缩算法和复制算法都会对内存碎片进行整理,这里指的压缩式就是对碎片空间进行整理.
整理后的内存空间规整,在分配对象内存空间的时候就可以通过指针碰撞的方法来获取内存空间,而不需要维护一个空闲列表
1.3.2 非压缩式垃圾回收器
反之,非压缩式垃圾回收器就不会对碎片内存空间进行整理.
此时分配对象内存空间,就必须通过维护一个空闲列表的方式来分配.
1.4 按工作的内存空间划分
按内存空间划分,可以分为年轻代垃圾回收器和老年代垃圾回收器.
2. 垃圾回收器的性能指标
垃圾回收器通过一些公共的性能指标来衡量垃圾回收器的性能.
2.1 程序运行的吞吐量
吞吐量证明程序运行的效率,吞吐量越大证明程序运行越快,垃圾回收的性能越高
公式: 程序运行时间 / (程序运行时间+垃圾回收时间)
2.2 垃圾回收的开销
垃圾回收的运行时间,越小越好,越小说明垃圾回收效率高,系统延迟低
公式: 垃圾回收时间 / (程序运行时间+垃圾回收时间)
与吞吐量相加等于1,互为补数
2.3 垃圾回收的暂停时间
即STW时间,越小说明延迟越低
2.4 垃圾回收的频率
垃圾回收的频率,需要适中
频率过小,每次垃圾回收的时间会过长
频率过大,停顿时间长,延迟高
2.5 堆空间内存占用
即堆空间的内存分配,这个肯定是越大越好
2.5 对象回收时间
一个对象从创建到回收的时间,即垃圾回收一个对象的时间.
2.6 总结
对于当前的jvm来说主要关注的指标有三个:
吞吐量,暂停时间和堆内存占用.
这三个指标不可能通知达到,因为他们是一个不可能的关系
内存变大,要回收的东西变多,暂停时间自然增加.
吞吐量增加,必然要降低垃圾回收频率,频率降低,垃圾谁收停顿时间必然增大.
因此,目前gc的优化方向主要是吞吐量和暂停时间.
而吞吐量和暂停时间之间也是矛盾的,这个时候如何抉择?
不同的垃圾回收器有不同的抉择方向:
Parallel以吞吐量优先
cms以停顿时间优先
而目前使用的G1则取折中方案: 在保证用户可接受的停顿时间的前提下,尽可能提高吞吐量.