垃圾回收器的发展历史
1999年:随JDK1.3.1一起来的串行方式Serial GC(第一款GC),ParNew GC是SerialGC的多线程版本。
2002年:2月26日,Parallel GC和Concurrent Mark Sweep GC(即CMS)跟随JDK1.4.2一起发布。Parallel GC在JDK6之后成为Hotspot默认GC。
2012年:在JDK1.7u4中,G1可用。
2017年:JDK9中G1成为默认垃圾回收器,以替代CMS.
2018年:3月,JDK10中G1的并行完整垃圾回收,实现并行性能改善最坏情况的延迟。
9月,JDK11发布,引入Epsilon GC,又称为“No-Op无操作”回收器,同时引入ZGC:可伸缩的低延迟回收器(Experimental)
2019年:3月,JDK12发布。增加G1,自动返回未使用堆内存给操作系统;同时,引入Shenandoah GC:地停顿时间的GC(Experimental)
9月,JDK13发布。增强ZGC,自动返回未使用堆内存给操作系统。
2020年:3月,JDK14发布。删除CMS,扩展ZGC,在mac和windows的应用。
频繁推出垃圾回收器的原因?
主要解决STW问题。
怎样避免垃圾收集器频繁回收?
可以内存调优:
a、堆内存空间设置比例较大
b、堆内存初始化与最大值一定保持一致
c、生成环境中不要去调用System.gc()
垃圾回收器何时触发收集垃圾?
当新生代或老年代内存满的时候。
垃圾回收器的7种类型
串行GC:采用单线程回收垃圾,用户线程处于等待状态,适合于堆内存空间比较小和个人小项目
并行GC:多条垃圾收集线程并行工作,但用户线程仍然处于等待状态。
并发GC:用户线程和垃圾收集线程同时执行,他们运行于不同的CPU上。(不一定是并行,可能是交替执行)
回收器 | 类型 | 算法 | 作用位置 | 特点 | 使用场景 |
---|---|---|---|---|---|
SerialGC | 串行收集器 | 复制算法 | 新生代 | 响应速度快 | 适合单核的客户端应用程序下 |
SerialGCOld | 串行收集器 | 标记整理算法 | 老年代 | 响应速度快 | 适合单核的客户端应用程序下 |
ParNew | 并行收集器 | 复制算法 | 新生代 | 响应速度快 | 适合多核的cpu情况下,默认与cms配合使用 |
Parallel | 并行收集器 | 复制算法 | 新生代 | 吞吐量优先 | 适合于后端多核cpu情况下 堆内存不是很大 |
Parallel old | 并行收集器 | 标记整理算法 | 老年代 | 老年代吞吐量优先 | 适合于后端多核cpu情况下 堆内存不是很大 |
CMS | 收集器并发收集器 | 标记清除 | 老年代 | 响应速度快 | 适合于企业级B/S项目 |
G1收集器 | 并发收集器 | 标记整理算法/复制算法 | 老年代/新生代 | 响应速度优先 | 适合于大型服务器端 |
垃圾回收器的组合方式
如何查看当前垃圾回收器
a、-XX:+PrintCommandLineFlags 参数可查看默认设置收集器类型
命令:java -XX:+PrintCommandLineFlags -version
b、JConsole工具
如何动态设置当前垃圾回收器
jinfo -flag +HeapDumpAfterFullGC pid
+号表示设置当前参数为true,-号为false。*
静态设置请参考垃圾回收器-串行并行、垃圾回收器-CMS、垃圾回收器-G1
垃圾回收器和垃圾回收算法区别
垃圾收集器:串行、并行收集、CMS、G1、Java11的ZGC收集器,能够降低对我们用户线程暂停的时间或者用户线程和GC线程同时运行。
垃圾收集算法:回收算法:标记清除、标记整理、标记复制、分代算法。
网友评论