GC分类与性能指标
GC分类
- 垃圾收集器没有在规范中进行过多的规定,可以有不同的厂商、不同的版本的JVM来实现
- 由于JDK的版本处于高速迭代的过程,因此Java发展至今已经衍生了众多GC版本
- 从不同角度分析垃圾收集器,可以将GC分为不同的类型
- 按照线程分为:串行垃圾回收器(默认在JDK Client模式)、并行垃圾回收器
- 按照工作模式分:可以分为并发式垃圾回收器和独占式垃圾回收器
- 按照碎片处理方式分:分为压缩式垃圾回收器(再分配对象空间使用:指针碰撞)与非垃圾回收器(再分配对象空间使用:空闲列表)
- 按工作内存空间分:年轻代垃圾回收器和老年代垃圾回收器
性能指标
- 吞吐量:运行用户代码的时间占总运行实间的比例
- 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
- 内存占用:Java堆区所占的内存大小
- 垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例
- 收集频率::相对于应用程序的执行,收集操作发生的频率
- 快速:一个对象从诞生到被回收所经历的时间。
不可能三角:吞吐量与暂停时间(STW)、内存占用只能满足两点
吞吐量(ThroughPut)
- 吞吐量是CPU用于运行用户代码的时间与CPU总耗时的比值,
- 吞吐量计算=运行用户代码时间/(运行用户代码时间+垃圾回收时间)
- 这种情况下,应用程序能容忍较高的暂停时间,因此高吞吐量的引用程序有更长的时间基准,快速响应式不必考虑
- 吞吐量优先,意味着在单位时间内,STW的时间次数少
暂停时间(Pause Time)
- 暂停时间是指一段时间内引用程序线程暂停,让GC线程执行的状态
- GC期间100毫秒的暂停时间意味着在这100毫秒期间内没有引用程序线城市活动的
- 暂停时间优先,意味着竟可能让赞提STW的时间最短
现在标准
在最大吞吐量优先的情况下,降低停顿时间
不同的垃圾回收器概述
Java常见的垃圾收集器有哪些?
经典垃圾收集器
- 串行回收器:Serial、Serial Old
- 并行回收器:ParNew、Parallel Scavenge、Parallel Old
- 并发回收器:CMS、G1
垃圾收集器分代之间的关系
- 新生代收集器:Serial ParNew Parallel Scavege
- 老年代收集器: Serial Old Parallel Old CMS
- 整堆收集器:G1
垃圾收集器的组合关系(JDK14)
- 为什么需要这么多垃圾收集器,一个不够嘛?因为Java应用场景多。
- 我要选择的是针对具体应用最适合的收集器
如何查看默认的垃圾收集器
-XX:+PrintCommandLineFlags:查看命令行线管参数 包括使用的垃圾收集器
jinfo -flag 相关垃圾回收器参数 进程id
Serial回收器:串行回收
- Serial 收集器作为HotSpot中Client模式下的默认新生代垃圾收集器
- Serial收集采用复制算法、串行回收和STW机制的方式执行内存回收。
- 除了收集年轻代之外,Serial收集器还提供了用于收集老年代的Serial Old收集器,Serial Old收集器同样采用了了串行收集 和STW机制,只不过内存回收算法使用的是标记压缩算法
- Client 模式下默认使用老年代的垃圾回收器
- Serial Old在Server模式下主要有两个用途
- 与新生代的Parallel Scavenge 配合使用
- 作为老年代CMS收集器的后背垃圾收集方案(CMS2020.3已经删除)