JVM垃圾回收器

简介: 盘点一下常考的垃圾回收算法

垃圾回收器

  1. 首先,垃圾回收算法有,标记复制、标记清除、标记整理
  2. 新生代收集器:Serial、ParNew、Parallel Scavenge
  3. 老年代收集器:Serial Old、Parallel Old、CMS
  4. 整堆收集器:G1
  5. JDK1.8默认收集器
  1. JDK 8默认搜集器为ParrallelGC,即Young区采用Parallel Scavenge,老年代采用Parallel Old进行收集(PS + PO)
  2. 这套配置的特点是吞吐量优先,一般适用于后台任务型服务器


Serial收集器

  1. Serial收集器是一种新生代的垃圾收集器,是一个单线程工作的收集器,使用标记复制算法进行回收
  2. 收集器在工作时必须暂停其他所有工作线程,成为Stop The World(STW)
  3. SefePoint 全局安全点:它就是代码中的一段特殊的位置,在所有用户线程到达 SafePoint 之后,用户线程挂起,GC 线程会进行清理工作。
  4. 优缺点:
  1. 高效简单,所有收集器汇总额外内存消耗最小的

ParNew收集器

  • Serial收集器的多线程版本,除了使用多线程外其他参数和机智与Serial完全一致
  • STW时,Parnew是多线程回收的,Serial是单线程的

Parallel Scavenge收集器

  • 新生代收集器(Java8默认年轻代收集器)
  • 基于标记复制算法,而且可以并行收集(多线程)
  • Parallel Scavenge与ParNew的区别
  • Parallel Scavenge更注重收集器的吞吐量上(用户代码时间/用户代码时间+垃圾手机的时间的值)

Serial Old收集器

  • 老年代收集器
  • 单线程收集器使用标记整理算法
  • Serial Old收集器有两种用途
  • 在JDK5和之前的版本与Parallel Scavenge搭配使用
  • 作为CMS收集器的备选

Parallel Old收集器

  • Parallel Scavenge的老年代版本
  • 支持多线程并发收集、基于标记-整理算法

CMS收集器

  • 老年代收集器
  • 主要目标是获取最短的回收停顿时间
  • 基于标记-清除算法支持并发收集
  • 收集流程如下:
  • 初始标记,标记GCroots直接关联到的对象,速度很快
  • 并发标记,并发标记从GCroots的直接关联对象开始遍历整个对象图。
  • 重新标记,检查错误标记或漏掉标记的情况
  • 并发清除
  • 初始标记重新标记需要STW
  • CMS的缺点
  • 在并发阶段会占用一部分应用线程降低吞吐量
  • CMS无法处理浮动垃圾
  • 浮动垃圾:由于并发标记并发清理阶段用户线程还在继续运行,这部分产生的垃圾无法处理
  • 标记清除会出现大量空间碎片
  • CMS回收过程中触发两次STW
  • 第一次暂停从root对象开始标记存活的对象,这个阶段称为初始标记;
  • 第二次暂停是在并发标记之后, 暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)

G1收集器

  • 全堆收集器
  • 面向堆内存的任何部分组成回收堆来组成回收集。
  • G1基于Region来进行回收
  • Region是堆内存中任意的布局(逻辑概念)。
  • 利用化整为零的思路,把内存区域划分成独立区域Region,
  • Region中Humongous区域专门用于存储大对象,G1认为只要大小超过Region容量一般的对象可认为大对象,存储在Humongous Region作为老年代
  • 运作过程
  • 初始标记:仅标记下GCRoots能够直接关联到的对象
  • 并发标记,不需要STW
  • 最终标记
  • 筛选回收
  • 负责更新 Region 的统计数据,对各个 Region 的回收价值和成本进行排序。
  • 根据用户所期望的停顿时间来制定回收计划,可以自由选择多个 Region 构成回收集,然后把决定要回收的那一部分 Region 存活对象复制到空的 Region 中,再清理掉整个旧 Region 的全部空间。
  • 缺点:
  • Region中存在跨带引用问题,虽然可以用记忆集解决,但是Region中跨代引用要复制很多
  • 如何保证收集线程与用户线程不干扰运行?
  • CMS使用增量更新算法
  • G1使用原始快照
  • G1为Region分配了两块TAMS指针,把Region中一部分划分出来用于并发回收(不会STW)过程中的新对象分配,新对象必须分配在指定的内存区域。如果回收速度赶不上分配速度也会STW,导致full gc


对比G1与CMS回收期的区别

  • CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用;
  • G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
  • CMS收集器以最小的停顿时间为目标的收集器;
  • G1收集器可预测垃圾回收的停顿时间
  • CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
  • G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。


ZGC

  1. JDK11 中加⼊的具有实验性质的低延迟垃圾收集器,⽬标是尽可能在不影响吞吐量的前提下,实现在任意堆内存大小都可以把停顿时间限制在 10ms 以内的低延迟。
  2. 基于 Region 内存布局,不设分代,使用了读屏障染色指针内存多重映射等技术实现可并发的标记整理,以低延迟为首要⽬标。 ZGC 的 Region 具有动态性,是动态创建和销毁的,并且容量⼤⼩也是动态变化的。  
相关文章
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
1008 55
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
444 27
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
299 0
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
298 0
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
424 28
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
1286 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?