专栏首页JVMGC常用新生代垃圾收集器
原创

常用新生代垃圾收集器

常用新生代垃圾收集器

TOC

Serial垃圾收集器

Serial是单线程垃圾回收器,当需要执行垃圾回收时,程序会暂停一切工作,然后单线程执行垃圾回收.

image-20201205224646344

单线程的好处就是减少上下文切换,减少系统开销.但是这种方式的缺点也很明显,在GC的过程中,会暂停程序执行. 若GC发生不频繁可以选这个. 对于新声代来说,区域比较小,停顿时间短.

优点

  • 简单高效,是Client模式下默认的垃圾收集器;
  • 对于资源受限的环境,比如单核(例如Docker中设置单核),单线程效率较高;
  • 内存小于一两百兆的桌面程序中,交互有限,则有限的STW是可以接受的。

缺点:

  • 垃圾回收速度较慢且回收能力有限,频繁的STW会导致较差的使用体验。

应用场景

  • 是HotSpot在Client模式下默认的新生代垃圾收集器
  • 在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的

ParNew垃圾收集器

ParNew同样用于新生代,是Serial的多线程版本,并且在参数,算法(同样的复制算法)和Serial相同.

Par是Parallel的缩写,多线程的意思,但是这里的多线程仅仅指垃圾收集多线程并行,并不是垃圾收集和程序并行运行.ParNew也需要暂停一切工作,然后多线程并行垃圾收集.

image-20201205224709752

因为是多线程执行,所以在多CPU环境下,效率比Serial高,但是在单CPU环境下,因为线程切换,反而性能比较差.

应用场景

在Server模式下,ParNew是一个非常重要的收集器,因为除Serial外,目前只有ParNew与CMS收集器配合工作.

image-20201205224732793

参数

  • "-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器;
  • "-XX:+UseParNewGC":强制指定使用ParNew;
  • "-XX:ParallelGCThreads":指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;

Parallel scavenge垃圾收集器

Parallel scavenge是一个新生代垃圾收集器,它是用复制算法的垃圾收集器,又是多线程并行的垃圾收集器,和ParNew类似.吞吐量优先的垃圾收集器,是Java1.8默认的新生代垃圾收集器.

主要特点

Parallel scavenge收集器的目标是达到一个可控的吞吐量,(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))

使用场景

Parallel scavenge收集器的高吞吐量可以最高效率的利用CPU,尽快的完成程序的运算任务,主要适合后台运算而不是太多交互的任务(太多交互的任务,适合用响应时间优先的CMS垃圾收集器)

Parallel scavenge可以精确控制吞吐量,通过两个参数:控制最大垃圾收集停顿时间-XX:MaxGCPauseills,设置吞吐量大小-XX:GCTimeRatio(GCTimeRatio的默认值为99,因此,GC耗时的占比应为1/(1+99)=1%。使用参数的理论效果:GCTimeRatio越大,吞吐量越大,GC的总耗时越小。有可能导致单次MinorGC耗时变长。适用于高运算场景). 它还可以用-XX:+UseAdaptiveSizePolicy参数进行自适应调节(GC Ergonomics),打开后会JVM会根据当前的运行状况动态调整最适合的吞吐量,配合前面两个参数更好.

wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HotSpot垃圾收集器1 Serial垃圾收集器2 ParNew垃圾收集器3 Parallel Scavenge垃圾收集器老年代垃圾收集器1 Serial Old垃圾收集器2 Parallel Ol

    JavaEdge
  • Java常见的垃圾收集器有哪些?

    Serial GC, 它是最古老的垃圾收集器, “Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-Wo...

    葆宁
  • 图解常见 GC 算法和垃圾收集器

    垃圾收集(Garbage Collection) 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 j...

    CoderJed
  • Java最新前沿技术:ZGC垃圾收集器

    ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括:

    程序IT圈
  • JVM-08垃圾收集Garbage Collection【GC常用参数】

    小小工匠
  • JVM垃圾回收器GC的常用参数

    by Sven Augustus https://my.oschina.net/langxSpirit

    斯武丶风晴
  • JVM老年代垃圾收集器Serial Old和Parallel Old

    根据老年代的特点,有人设计了标记-整理(Mark Compact)算法,标记过程和标记-清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让存活对象向...

    入门小站
  • 《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    http://blog.csdn.net/chjttony/article/details/7883748#comments

    bear_fish
  • JVM垃圾回收器原理及使用介绍

    Java语音的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增...

    海仔
  • 13道关于JVM垃圾收集器的面试题,哪些你还不会?

    13道关于JVM垃圾收集器的面试题,哪些你还不会? ...

    Java架构师必看
  • 关于生产环境改用G1垃圾收集器的思考

    由于我们的业务量非常大,响应延迟要求高。目前沿用的老的ParNew+CMS已经不能支撑业务的需求。平均一台机器在1个月内有1次秒级别的stop the ...

    静儿
  • 面试官:你对JVM垃圾收集器了解吗?13连问你是否抗的住!

    4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    程序员追风
  • JVM面试问题系列:7种JVM垃圾收集器特点,优劣势、及使用场景!

    Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用...

    zhisheng
  • 持续3分钟 - Java -06

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收年老代主要使用标记-整理垃圾回收算法,因此 java 虚拟中针对新生代和年老代...

    子乾建建-Jeff
  • JVM:这是一份全面 & 详细的 常见垃圾收集器 汇总攻略

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Carson.Ho
  • 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用...

    程序员追风
  • Java垃圾回收的工作原理和最佳做法

    Java垃圾回收是Java程序执行自动内存管理的过程。Java程序编译为字节码,可以在Java虚拟机(简称JVM)上运行。当Java程序在JVM上运行时,将在堆...

    陈哈哈
  • 超长JVM总结,面试必备

    JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,...

    java金融
  • 新生代的垃圾回收:Copy GC之基本原理

    据我所能查到的资料,基于复制的GC算法最早是Marvin Minsky提出来的。 这个算法的思路很简单,总的来说,就是把空间分成两部分,一个叫分配空间(Allo...

    海纳

扫码关注云+社区

领取腾讯云代金券