35、垃圾回收器 — 概述
01
垃圾回收器性能指标
- 吞吐量:运行用户代码的时间占总运行时间的比例 
- 总运行时间 = 程序运行时间 + 内存回收时间 
- 垃圾收集开销:吞吐量的补数,垃圾收集所用时间占总运行时间的比例 
- 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。即STW的时间。 
- 收集频率:相对于应用程序的执行,收集操作发生的频率 
- 内存占用:Java堆区所占的内存大小 
- 快速:一个对象从诞生到被回收所经历的时间 
- 注意:吞吐量、暂停时间、内存占用三项指标不可能都达到最优。现在一般主要抓住吞吐量和暂停时间两个指标 
02
吞吐量(throughput)和暂停时间
- 吞吐量: 
- 吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)。 
- 在考虑吞吐量的情况下,应用程序能容忍较高的暂停时间,因此,高吞吐量的应用程序有更长的时间基准,快速响应是不必考虑的。 
- 吞吐量优先,意味着在单位时间内,STW时间最短:0.2+0.2 = 0.4 
- 暂停时间 
- 暂停时间是指一个时间段内应用程序线程暂停,让GC线程执行的状态 
- 暂停时间优先,意味着尽可能让单次STW时间最短:0.1+0.1+0.1+0.1+0.1=0.5 
- 吞吐量 VS 暂停时间 
- 直觉上,吞吐量越高程序运行越快 
- 低暂停时间用于不能打断用户体验,特别是对于交互式应用程序 
- 吞吐量高(越大越好)、暂停时间(越小越好)就高 
- 现在一般都是设计在最大吞吐量的情况下,降低暂停时间 
03
不同的垃圾回收器(七种经典垃圾回收器)
- 串行回收器:Serial、Serial Old 
- 并行回收器:ParNew、Parallel Scavenge、Parallel Old 
- 并发回收器:CMS、G1 
04
七种垃圾回收器组合关系
- 新生代、老年代&整堆回收器 
- 新生代回收器:Serial、Parallel Scavenge、ParNew 
- 老年代回收器:Serial Old、 Parallel Old、CMS 
- 整推回收器:G1 
- 垃圾回收器组合关系:下图中红色虚线在JDK8中不建议使用了,在JDK9中直接不能使用 
05
查看默认的垃圾回收器
- -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器) 
- 使用命令行指令:jinfo -flag 相关垃圾回收器参数,进程ID 
- JDK8 中没有使用G1回收器,JDK9中开始使用 
扫码关注我
你们点点“分享”,给我充点儿电吧~
