JVM深入学习(十七)-垃圾回收器类型及概述

简介: 垃圾回收器有那些?为什么垃圾回收器有这么多?

jvm在长时间的演变过程中出现了很多垃圾回收器,在这里总结一下

1. 7种经典垃圾回收器

串行垃圾回收器: Serial,Serial Old(回收老年代)

并行垃圾回收器: ParNew, Parallel Scavenge, Parallel Old(回收老年代)

并发垃圾回收器: CMS,G1

2. 垃圾回收器的演变过程

  1. 1999年jdk1.3 第一款垃圾回收器 Serial串行垃圾回收器, ParNew是Serial的多线程版本
  2. 2002年jdk1.4 发布 Parallel 和 CMS(Concurrent Mark Sweep)垃圾回收器
  3. jdk1.6 默认垃圾回收器 Parallel
  4. 2012年jdk1.7 发布G1
  5. 2017 jdk9 默认垃圾回收器G1 替代CMS
  6. 2018年3月 jdk10 G1增加并行垃圾回收
  7. 2018年9月 jdk11发布 增加ZGC
  8. 2019年3月 jdk12增强G1, OpenJdk中新增RedHat开发的Shenandoah垃圾回收器(低延迟)
  9. 2019年9月 jdk13发布增强ZGC
  10. 2020年3月 jdk14发布,删除CMS,扩展ZGC在mac和win上的应用.

可以总结,在jdk9之前一直用的 Parallel垃圾回收器,即Parallel Scavenge+Parallel Old的集合

jdk9之后开始使用G1

未来可能使用ZGC

3. 垃圾回收器和垃圾分代之间的关系

jvm是分代的,那么垃圾回收器也会针对不同的分代区域进行回收

新生代回收: Serial, Parallel Scavenge, ParNew

老年代回收: Serial Old, Parallel Old, CMS

整堆回收: G1

3.1 组合关系

既然垃圾回收器也是基于分代思想的,那么垃圾回收器肯定要组合使用,组合关系如下:

  1. 蓝色的为新生代垃圾回收器
  2. 橘色为老年代垃圾回收器
  3. G1特殊,既可以回收新生代又可以回收老年代
  4. 红色虚线为jdk8之前(不包含jdk8)存在的组合关系,jdk8之后移除 例如Serial+CMS; ParNew+Serial Old
  5. 绿色的虚线为jdk14之后移除的组合关系其中CMS在jdk14之后彻底移除
  6. CMS和Serial Old同为老年代回收器,未什么同时使用?
  1. SerialOld是CMS的后备方案,用来处理当CMS回收失败的时候再次回收
  2. CMS因为是并发的垃圾回收器,在多个线程交替执行的时候,可能存在回收失败的情况(这也可以看作并发垃圾回收器的缺点之一).

3.2 为什么要有组合关系

疑问:

为什么需要多个垃圾回收器组合使用,既然G1是最先进的垃圾回收器,为什么不把其他的垃圾回收器全部删除掉,启用G1呢?

理解:

java是一个适用于多平台多环境的语言,jvm可能运行在各种情况下,而在不同的情况下需要不同的垃圾回收器,

例如: 在单核cpu的情况下,Serial的性能反而较好,因为jvm运行在只有一个线程的处理器上,那也谈不上并发了.

同理在不同的应用场景下需要有不同的垃圾处理器,正如上文所说,垃圾处理器的优化方向是低延迟和吞吐量,那在不同的场景下对这两种方向需求程度可能不一致

例如: java作为移动端使用的时候,我们为了提高用户体验,可能对低延迟要求更高; 而作为一个服务端提供服务时,可能会稍微降低对延迟的要求,而是提高吞吐量的需求,这个时候就需要按需组合垃圾回收器的关系,从而更加符合我们的需求.

总结:

没有一个完美的垃圾回收器,只有最符合需求的垃圾回收器.

目录
相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
68 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
33 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
30 4
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
46 3
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
56 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
13天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
11天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
10 1
|
1月前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
30天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
48 10