JVM具体的垃圾回收类型

  • 2019 年 09 月 21 日
  • 31次
  • 1871 字
  • 暂无评论

  • Java的GC回收类型主要以下几种:

    新生代

    1. UseSerialGC:串行收集器(新生代使用)

      • 串行收集器是一个单线程的收集器,在进行垃圾回收的时候,必须暂停其他所有工作线程直到它收集结束。
      • 开启:-XX:+UseSerialGC
      • 开启后,Young区会使用Serial收集器,Old区会使用Serial Old收集器。新生代使用复制算法,老年带使用标记整理算法。
        1.png
    2. UseParNewGC:并行收集器(新生代使用)

      • ParNewGC收集器其实就是SerialGC收集器新生代的并行多线程版本。
      • 最常见的应用场景是配合老年带的CMS GC工作。
      • ParNewGC并行收集器在垃圾收集过程中也需要暂停所有其他工作线程。
      • 它是很多java虚拟机运行在Serve模式下新生代的默认垃圾收集器。
      • 备注:-XX:ParallelGCThreads:限制并行收集器线程数量。默认开启和CPU数目相同的线程数。
      • 开启:-XX:+UseParNewGC
      • 开启后,Young区会使用ParNew收集器,Old区会使用Serial Old收集器。新生代使用复制算法,老年带使用标记整理算法。
        2.png
    3. UseParallelGC:并行收集器(新生代使用)

      • Parallel Scaveng收集器类似ParNew,也是一个新生代垃圾收集器,使用复制算法。
      • 是一个并行的多线程的垃圾收集器,俗称吞吐量优先收集器。
      • 它重点关注的是:可控制的吞吐量(Thoughput = 运行用户代码时间 / (运行用户代码时间+垃圾收集器时间) ),也即比如程序运行100min,垃圾收集时间1min,吞吐量就是99%。高吞吐量意味着高效率利用CPU的时间,它多用于后台运算而不需要太多交互的任务。
      • 自适应调节策略也是Parallel Sacvenge收集器与ParNew收集器的一个重要区别。(自适应调节策略:虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间(-XX:MaxGCPauseMillis)或最大吞吐量。)
      • 开启:-XX:UseParallelGC或-XX:UseParallelOldGC,可互相激活。
      • 开启后,新生代使用复制算法,老年带使用标记整理算法。

      3.png

    老年代

    1. UseParallelOldGC:并行收集器(老年代使用)

      • Parallel Old收集器是Parallel Scavenge的老年带版本,使用多线程的标记整理算法。在JDK1.6开始提供。
      • 在JDK1.6之前,新生代使用Parallel Scavenge收集器配合老年代的Serial Old收集器,只能保证新生代的吞吐量,无法保证整体的吞吐量。
      • Parallel Old正是为了在老年代同样提供吞吐量优先的垃圾收集器。
      • 开启:-XX:+UseParallelOldGC
      • 开启后,新生代使用UseParallelGC(Parallel Scavenge),老年代使用UseParallelOldGC。
    2. UseConcMarkSweepGC:并发清除收集器(CMS)(老年代使用)

      • CMS收集器(Concurrent Mark Sweep)是一种以获取最短回收停顿时间为目标的收集器。适用应用在互联网或者B/S系统的服务器上。这类应用尤其重视服务器的响应速度,希望系统停顿的时间最短,垃圾收集器线程与用户线程一起执行。
      • CMS非常适合堆内存大、CPU核数多的服务器应用,也是G1收集器出现之前大型应用的首选收集器。
      • 开启:-XX:+UseConcMarkSweepGC
      • 开启该参数后会自动将-XX:+UseParNewGC开启。Young区使用ParNew,Old区使用CMS,Serial Old作为CMS出错后的后备收集器。
      • 优点:并发收集低停顿。
      • 缺点:

        • 并发执行,对CPU资源压力大。由于并发进行,CMS在收集垃圾与应用线程会同时会增加对堆内存的占用,也就是说:CMS必须要在老年代堆内存用尽之前完成垃圾回收,否则CMS回收失败时,将触发担保机制,串行老年代收集器(Serial Old)会以STW(Stop The World)的方式进行一次GC,从而造成较长时间的停顿。
        • CMS收集器采用的是标记清除算法,会导致大量碎片。标记清除算法无法整理空间碎片,老年代空间会随着应用时长被逐步耗尽,最后将不得不通过担保机制对堆内存进行压缩。CMS也提供了参数-XX:CMSFullGCsBeForeCompaction(默认0,即每次都进行内存整理)来指定多少次CMS收集之后来进行一次压缩的FullGC。

    4.png

    1. Serial Old:串行收集器(老年代使用)

      • Serial Old是Serial垃圾收集器老年代版本,它同样是单线程 的收集器,使用标记整理算法。
      • 它作为老年带区中使用CMS收集器的后备垃圾收集方案。
    2. UseG1GC(老年代使用)

      • 非G1垃圾收集器的特点

        1. 年轻代和老年代是各自独立且联系的内存块;
        2. 年轻代收集使用单eden+S0+S1进行复制算法;
        3. 老年代收集必须扫描整个老年代区域;
        4. 都是以尽可能少而快速的执行GC未设计原则。
      • G1收集器像CMS收集器一样,能与应用程序线程并发执行。
      • G1收集器的设计目的是取代CMS收集器。
      • G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。
      • G1的STW更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间。
      • 特点总结:

        1. G1能充分利用多CPU、多核环境硬件优势,尽量缩短STW。
        2. G1整体上采用标记整理算法,局部是通过复制算法。不会产生内存碎片。
      • 底层原理

        1. G1区域化内存碎片Region,整体编为了一些列不连续的内存区域,避免了全内存区的GC操作。
        2. 每个分区也不会固定的为某个代服务,可以按需在年轻代和老年代之间切换。
        3. 核心思想是将整个内存区域划分成大小相同的子区域(Region),在JVM启动时会自动设置这些子区域的大小。
        4. 启动时可以通过参数-XX:G1HeapRegionSize=n指定区分大小(1MB~32MB,且必须是2的幂次方),默认将整堆划分为2048个分区。也即G1能够支持的最大内存是:32MB * 2048 = 64GB内存。
        5. G1仍然属于分代收集器。

          • 它所划分的子区域(Region)的一部分包含新生代,新生代的垃圾收集器依然采用暂停所有应用线程的方式,将存活对象拷贝到Survivor或老年代空间。
          • 它所划分的子区域 (Region)的一部分包含老年代,G1收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。这意味着在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有CMS内存碎片的问题了。
        6. 在堆的使用上,G1并不要求对象的存储一定是物理上连续的,只要是逻辑上连续即可。
      • 收集过程

        1. 初始标记:只标记GC Roots能直接关联到的对象。
        2. 并发标记:进行GC Roots Tracing的过程。
        3. 追踪标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象。
        4. 筛选回收:根据时间来进行价值最大化的回收。
        5. 模型图:
          5.png
      • 常用配置参数:

        • -XX:+UseG1GC:启用G1收集器
        • -XX:G1HeapRegionSize=n:设置G1区域的大小,值是2的幂;范围是1M到32M。目标是根据最小的Java堆大小划分出约2048个区域。
        • -XX:MaxGCPauseMillis=n : 最大停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿时间小于这个时间。
        • -XX:InitiatingHeapOccupancyPercent=n:堆占用了多少的时候就触发GC,默认是45。
        • -XX:ConcGCThreads=n:并发GC使用的线程数。
        • -XX:G1ReservePercent=n:设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险,默认值是10%。

    6.png


版权属于:东窗凝残月

本文链接:https://blog.jsiqi.com/index.php/Java/184.html

欢迎学习交流,转载请保留作者信息以及原文链接,文章注明不可转载的除外。



—— 暂无评论 ——

OωO