• JVM原理及优化_垃圾回收器


    JVM原理及调优_垃圾回收器

    什么是垃圾收集器?
    • 垃圾收集器是垃圾回收算法(引用计数法、标记清除法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。

    图中展示了7种不同分代的收集器:
    Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old、G1

    而它们所处区域,则表明其是属于新生代还是老年代的收集器:

    • 新生代收集器:Serial、ParNew、Parallel Scavenge
    • 老年代收集器:CMS、Serial Old、Parallel Old
    • 整堆收集器:G1

    两个收集器间有连线,表明它们可以搭配使用:

    Serial / Serial Old
    Serial / CMS
    ParNew / Serial Old
    ParNew / CMS
    Parallel Scavenge / Serial Old
    Parallel Scavenge / Parallel Old
    G1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    垃圾回收器详解
    Serial

    Serial 收集器:新生代。发展历史最悠久的收集器。它是一个单线程收集器,它只会使用一个 CPU 或者线程去完成垃圾收集工作,而且在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
    特点:

    新生代收集器,使用复制算法收集新生代垃圾。
    单线程的收集器,GC工作时,其它所有线程都将停止工作。
    简单高效,适合单 CPU 环境。单线程没有线程交互的开销,因此拥有最高的单线程收集效率。

    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    设置垃圾收集器:"-XX:+UseSerialGC"  --添加该参数来显式的使用改垃圾收集器;
    
    • 1
    • 2
    • 3
    ParNew

    ParNew 收集器:新生代。Serial 的多线程版本,即同时启动多个线程去进行垃圾收集。
    特点:

    新生代收集器。ParNew垃圾收集器是Serial收集器的多线程版本,采用复制算法。
    除了多线程外,其余的行为、特点和Serial收集器一样。
    只有它能与 CMS 收集器配合使用。
    但在单个CPU环境中,不比Serail收集器好,多线程使用它比较好。

    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    设置垃圾收集器:"-XX:+UseParNewGC"  --强制指定使用ParNew;    
    设置垃圾收集器: "-XX:+UseConcMarkSweepGC"  --指定使用CMS后,会默认使用ParNew作为新生代收集器;
    设置垃圾收集器参数:"-XX:ParallelGCThreads"  --指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    Parallel Scavenge

    Parallel Scavenge 收集器:新生代。和 ParNew 的关注点不一样,该收集器更关注吞吐量,尽快地完成计算任务。
    特点:

    新生代收集器。
    采用复制算法。
    多线程收集。
    与ParNew 不同的是:高吞吐量为目标,(减少垃圾收集时间,让用户代码获得更长的运行时间)

    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    设置垃圾收集器:"-XX:+UseParallelGC"  --添加该参数来显式的使用改垃圾收集器;
    设置垃圾收集器参数:"-XX:MaxGCPauseMillis"  --控制垃圾回收时最大的停顿时间(单位ms)
    设置垃圾收集器参数:"-XX:GCTimeRatio"  --控制程序运行的吞吐量大小吞吐量大小=代码执行时间/(代码执行时间+gc回收的时间)
    设置垃圾收集器参数:"-XX:UseAdaptiveSizePolicy"  --内存调优交给虚拟机管理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    Serial Old
    • Serial Old 收集器:Serial 的老年代版本,使用标记 - 整理算法。

    特点:

    1. 老年代收集器, 采用"标记-整理"算法。
    2. 单线程收集。
    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    在JDK1.5及之前,与Parallel Scavenge收集器搭配使用,
    在JDK1.6后有Parallel Old收集器可搭配。
    现在的作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    Parallnel old
    • Parallnel old 收集器,多线程:Parallel 的老年代版本,使用标记 - 整理算法。

    特点:

    1. 针对老年代。
    2. 采用"标记-整理"算法。
    3. 多线程收集。
    4. 但在单个CPU环境中,不比Serial Old收集器好,多线程使用它比较好。
    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
     设置垃圾收集器:"-XX:+UseParallelOldGC":指定使用Parallel Old收集器;
    
    • 1
    • 2
    • 3
    CMS
    • CMS 收集器:老年代。是一种以获取最短回收停顿时间为目标的收集器,适用于互联网站或者 B/S 系统的服务端上。
      特点:
    1. 针对老年代,采用标记-清楚法清除垃圾;
    2. 基于"标记-清除"算法(不进行压缩操作,产生内存碎片);
    3. 以获取最短回收停顿时间为目标;
    4. 并发收集、低停顿;
    5. CMS收集器有3个明显的缺点:1.对CPU资源非常敏感、2.无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败、3.产生大量内存碎片
    6. 垃圾收集线程与用户线程(基本上)可以同时工作
    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    设置垃圾收集器:"-XX:+UseConcMarkSweepGC":指定使用CMS收集器;
    
    • 1
    • 2
    • 3
    G1
    • G1 收集器:分代收集器。当今收集器技术发展最前沿成果之一,是一款面向服务端应用的垃圾收集器。G1可以说是CMS的终极改进版,解决了CMS内存碎片、更多的内存空间登问题。虽然流程与CMS比较相似,但底层的原理已是完全不同。

    特点:

    1. 能充分利用多CPU、多核环境下的硬件优势;
    2. 可以并行来缩短(Stop The World)停顿时间;
    3. 也可以并发让垃圾收集与用户程序同时进行;
    4. 分代收集,收集范围包括新生代和老年代
    5. 能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
    6. 能够采用不同方式处理不同时期的对象;
    7. 应用场景可以面向服务端应用,针对具有大内存、多处理器的机器;
    8. 采用标记-整理 + 复制算法来回收垃圾
    //如何设置JVM参数底下会讲解:这里只是列举一部分参数:
    
    设置垃圾收集器:"-XX:+UseG1GC":指定使用G1收集器;
    设置垃圾收集器参数:"-XX:InitiatingHeapOccupancyPercent":当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45;
    设置垃圾收集器参数:"-XX:MaxGCPauseMillis":为G1设置暂停时间目标,默认值为200毫秒;
    设置垃圾收集器参数:"-XX:G1HeapRegionSize":设置每个Region大小,范围1MB到32MB;目标是在最小Java堆时可以拥有约2048Region
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    Java实现PDF文字内容识别,结合OCR实现PDF图片实现
    做个清醒的程序员之拒绝工作
    时序数据库选型
    8-4 Prometheus服务发现
    前端食堂技术周刊第 115 期:Rolldown 正式开源、马斯克宣布 xAI 本周将开源 Grok、如何使用 Copilot 完成 50% 的日常工作?
    基于JAVA信用卡逾期数据处理分析系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    c++ std::move和std::forward总结与使用
    AAAI‘22 推荐系统论文梳理
    安装Oracle
    【MySQL —— 数据库约束】
  • 原文地址:https://blog.csdn.net/weixin_44219219/article/details/126934757