垃圾回收算法
- 引用计数法:无法解决循环引用,java不采用
- 复制算法:年轻代算法
- 标记清除:
- 标记整理:
垃圾回收方式
- Serial:串行。为单线程环境设计且只使用一个线程进行垃圾回收,会暂停用户线程,不适合服务器环境
- Parallel:并行。多个垃圾收集线程进行垃圾回收,用户线程短暂暂停,适用于科学计算/大数据平台等弱交互场景
- CMS:并发。用户线程和垃圾回收线程同时执行(不一定是并行,可能是交替执行),不用暂停用户线程,适用于对响应时间有要求的场景,互联网公司多采用此方式,缺点是老年代垃圾回收采用标记清除方法,会产生内存碎片,并发执行也会对服务器内存造成更大压力
- G1:
查看默认垃圾回收器
java -XX:+PrintCommandLineFlags -version
7大垃圾回收器
- Serial:新生代串行垃圾回收器,新生代使用复制算法,老年代使用标记整理算法。适用于单线程环境,现在生产环境很少使用。使用此回收器老年代默认激活SerialOld回收器
-XX:+UseSerialGC
- SerialOld:老年代串行垃圾回收器。java8以后不再使用,使用此回收器新生代默认激活Serial回收器
-XX:+UseSerialOldGC
- ParNew:新生代并行垃圾回收器,新生代使用复制算法,老年代使用标记整理算法。最常用场景是配合老年代CMS GC工作,是许多java虚拟机运行在server模式下默认的新生代垃圾回收器。命令行如果只配置此垃圾回收器,那么老年代默认会使用Serial Old垃圾回收器,官方不再推荐这种组合
-XX:+UseParNewGC
- Parallel:新生代并行垃圾回收器。简单来说就是Serial垃圾回收器的并行化,适用于在后台运行弱交互的程序。它关注的是吞吐量,吞吐量=程序运行时长/(程序运行时长+垃圾回收时长)。自适应调节策略是Parallel收集器和Parnew收集器的一个重要区别,虚拟机会根据当前系统运行情况收集监控信息,动态调整参数来获得最合适的GC停顿时间和吞吐量。使用此回收器老年代默认激活ParallelOld回收器
-XX:+UseParallelGC
- ParNewOld:老年代并行垃圾回收器。使用此回收器新生代默认激活Parallel回收器
-XX:+UseParallelOldGC
- CMS:并发垃圾回收器。新生代使用复制算法,老年代使用标记清除算法,是一种以获取最短回收停顿时间为目标的垃圾回收器。在G1出现之前,是大型互联网应用首选垃圾回收器。使用此回收器新生代默认激活ParNew回收器
-XX +UseConcMarkSweepGC
CMS标记清除过程分4步,如图所示
6. G1:是一款server端的垃圾回收器,应用在多处理器和大容量内存环境中,实现高吞吐量同时,尽可能满足垃圾收集暂停时间的要求。有以下特性:
- 与CMS收集器一样,可以和应用程序线程并发执行
- G1增加了内存整理,不会产生内存碎片
- G1 STW更可控,在垃圾回收停顿时间上添加了预测机制,用户可以指定期望停顿时间
XX:+UseG1GC