zoukankan      html  css  js  c++  java
  • JVM垃圾回收机制三

    垃圾回收器

    分代垃圾回收常见的垃圾回收器

    判断一个垃圾回收器好坏的标准
    1、吞吐量越高越好
    2、工作线程暂停时间越短越好。

    Serial垃圾回收器

    串行回收器时最古老的最基本的垃圾回收器,工作线程会产生较长时间的停顿,只使用一个线程去回收。新生代使用复制算法,老年代使用标记压缩算法。
    特点:它是单线程的串行回收,在进行垃圾回收时,其他工作线程无法工作。

    JVM参数配置:-XX:+UseSerialGC

    ParNew收集器

    它是serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法,老年代标记整理算法。它可以和老年代回收器CMS回收器配合使用。在单核CPU下,它的收集效率不如Serial,因为多线程间存在上下文切换。

    JVM参数配置:-XX:+UseParNewGC
    -XX:+ParallerGCThreads 限制线程数量
    并行:指多条垃圾回收线程并行工作,用户的工作线程仍然处于等待状态。
    并发:用户线程于垃圾回收线程同时执行,用户工作线程仍然可以工作

    Paraller Scavenge收集器

    类似于ParNew收集器同样是新生代的多线程收集器,但ParNew关注的是尽可能缩短用户的线程的等待时间,而ParScavenge想提高吞吐量。
    吞吐量:CPU运行用户代码的时间于CPU总耗时的比值。即吞吐量=运行用代码时间/(运行用户代码时间+垃圾收集时间)。
    JVM参数:-XX:+UserParallelGC

    Parallel Old

    Parallel Scavenge收集器的老年代,使用多线程和标记整理算法。可与Parallel Scavenge配合使用来提高吞吐量。

    JVM参数:-XX:UserParallelOldGc

    Serial Old

    Serial 收集器的老年代版本。

    CMS垃圾收集器

    旨在缩短用户线程的等待时间,是一种老年代收集器,采用标记清除算法,垃圾收集线程可以用户工作线程并发的执行。CMS将整个垃圾回收过程分成了四个步骤:
    1、初始标记:标记出与GCRoots相关联的对象,速度很快。
    2、并发标记:标记出GC Roots引用链上的所有对象,此过程可以和用户线程并发执行
    3、重新标记:在并发标记过程中,因为用户线程并发的执行,可能某些对象引用发生变化,此过程是为了更正变动的对象引用。
    4、并发清除:

    初始标记和重新标记必须暂停用户工作线程,但这两个过程执行速度很快。并发标记和并发清除耗时较长,可以与用户线程并发的执行。
    CMS收集器的缺点:
    (1)无法处理在并发标记过程中产生的垃圾,只能等到下次垃圾回收再清理。产生的垃圾有可能将内存空间填满,无法为新对象分配足够的内存空间,从而出现“Concurrent Mode Failure”。
    (2)产生空间碎片,由于采用标记清除算法,所以可能会产生大量的空间碎片。
    (3)因为并发阶段,垃圾回收线程会与用户线程竞争资源,导致吞吐量降低。

    G1回收器

    特点:
    (1)并行并发同在,在多核CPU下,使用多个CPU进行垃圾回收,来缩短用户等待时间。
    (2)分区收集,与其他垃圾回收器一样,虽然有新生代和老年代的概念,但它将整个JVM堆分为若干个大小相等的独立区域(Region),但新生代和老年代不再是物理隔离了。
    (3)空间整合,不会产生内存空间碎片。
    (4)可预测的停顿,建立棵可预测的停顿时间模型,使用者可以指定垃圾收集时间不得超过多长时间。
    回收过程:
    初始标记
    并发标记
    最终标记
    筛选回收:对各个区域中的回收价值进行排序,选择允许时间内,价值最大的进行回收

  • 相关阅读:
    浅谈均值、方差、标准差、协方差的概念及意义
    数据库设计的基本步骤
    VS添加lib库
    Android activity_main.xml删除边缘距离,充满屏幕
    Android 设置旋转朝向
    WebStorm注册码
    VS禁止特定警告
    VS 高亮显示不带后缀的C++头文件
    VS2010设置C++包含目录和库目录
    读取STL模型
  • 原文地址:https://www.cnblogs.com/ozho/p/10597082.html
Copyright © 2011-2022 走看看