• 说一下 JVM 有哪些垃圾回收器?


    如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。不同收集器之间的连线表示它们可以搭配使用。

    • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;

    • ParNew收集器 (复制算法): 新生代并行收集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;

    • Parallel Scavenge收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;

    • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;

    • Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;

    • CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。

    • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

    收集器工作方式描述回收区域算法特点
    Serial串行工作线程暂停,一个线程进行垃圾回收新生代标记-复制
    Serial Old串行工作线程暂停,一个线程进行垃圾回收老生代标记-整理
    ParNew并行工作线程暂停,多个线程进行垃圾回收新生代标记-复制Serial 的多线程版本
    CMS并行用户和垃圾回收线程同时进行老生代标记-清除低暂停
    Parallel Scavenge并行工作线程暂停,一个线程进行垃圾回收新生代标记-复制和 ParNew 相比能动态调整内存分配
    jdk8默认
    Parallel Old并行工作线程暂停,多个线程进行垃圾回收老生代标记-整理替代串行的 Serial Old
    G1并行用户和垃圾回收线程同时进行整堆分区算法延迟可控的情况下尽量提高吞吐量
    jdk9默认
    ZGC并行用户和垃圾回收线程同时进行整堆分页算法暂停时间不超过1ms
  • 相关阅读:
    hibernate源码(2)--- springboot-jpa是如何引入的
    [附源码]Python计算机毕业设计Django基于web的羽毛球管理系统
    注册中心服务eureka 切换到 nocas遇到的问题
    [附源码]Python计算机毕业设计Django的高校车辆租赁管理系统
    05 pyecharts 基本图表(示例代码+效果图)
    数据库同步有哪些方式?【怎么保障目标和源数据一致性】
    酷开系统 | 酷开科技让你放肆嗨唱,聆听内心最真实的声音
    【学习】loss图和accuracy
    正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.3
    【OpenCV实现图像:OpenCV进行OCR字符分割】
  • 原文地址:https://blog.csdn.net/u011241051/article/details/136192551