专栏首页FREE SOLOJava常见的垃圾收集器有哪些?

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

Serial GC, 它是最古老的垃圾收集器, “Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态。当然,其单线程设计也意味着精简的GC实现,无需维护复杂的数据结构,初始化也简单,所以一直是Client模式下JVM的默认选项。 从年代的角度,通常将其老年代实现单独称作Serial Old,它采用了标记-整理(Mark-Compact)算法,区别于新生代的复制算法。Serial GC的对应JVM参数是:-XX:+UseSerialGC

ParNew GC, 很明显是个新生代GC实现,它实际是Serial GC的多线程版本,最常见的应用场景是配合老年代的CMS GC工作,下面是对应参数 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC CMS GC,基于标记-清除(Mark-Sweep)算法 设计目标是尽量减少停顿时间,这一点对于Web等反应时间敏感的应用非常重要,一直到今天,仍然有很多系统使用CMS GC。但是, CMS采用的标记-清除算法,存在着内存碎片化问题,所以难以避免在长时间运行等情况下发生full GC,导致恶劣的停顿。另外,既然强调了并发(Concurrent), CMS会占用更多CPU资源,并和用户线程争抢。

Parrallel GC, 在早期JDK 8等版本中,它是server模式JVM的默认GC选择,也被称作是吞吐量优先的GC。它的算法和Serial GC比较相似,尽管实现要复杂的多,其特点是新生代和老年代GC都是并行进行的,在常见的服务器环境中更加高效。开启选项是:-XX:+UseParallelGC 另外, Parallel GC引入了开发者友好的配置项,我们可以直接设置暂停时间或吞吐量等目标, JVM会自动进行适应性调整,例如下面参数:

-XX:MaxGCPauseMillis=value,
-XX:GCTimeRatio=N	//GC时间和用户时间比例 = 1 / (N+1)

查看jdk垃圾收集器:java -XX:+PrintCommandLineFlags -version

G1 GC这是一种兼顾吞吐量和停顿时间的GC实现,是Oracle JDK 9以后的默认GC选项。 G1可以直观的设定停顿时间的目标,相比于CMS GC, G1未必能做到CMS在最好情况下的延时停顿,但是最差情况要好很多。 G1 GC仍然存在着年代的概念,但是其内存结构并不是简单的条带式划分,而是类似棋盘的一个个region。 Region之间是复制算法,但整体上实际可看作是标记-整理(MarkCompact)算法,可以有效地避免内存碎片,尤其是当Java堆非常大的时候, G1的优势更加明显。 G1吞吐量和停顿表现都非常不错,并且仍然在不断地完善,与此同时CMS已经在JDK 9中被标记为废弃(deprecated),所以G1 GC值得你深入掌握。

目前尚处于开发中的 JDK 11,你会发现,JDK 又增加了两种全新的 GC 方式,分 别是: Epsilon GC 简单说就是个不做垃圾收集的 GC,似乎有点奇怪,有的情况下,例如在进行 性能测试的时候,可能需要明确判断 GC 本身产生了多大的开销,这就是其典型应用场景。

ZGC 这是 Oracle 开源出来的一个超级 GC 实现,具备令人惊讶的扩展能力,比如支持 T bytes 级别的堆大小,并且保证绝大部分情况下,延迟都不会超过 10 ms。虽然目前还处于 实验阶段,仅支持 Linux 64 位的平台,但其已经表现出的能力和潜力都非常令人期待。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试:JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存?

    JVM中, 所有对象都是在堆中分配内存空间的,栈只用于保存局部变量和临时变量,如果是对象,只保存引用,实际内存还是在堆中;一个java对象占用的内存空间,除了...

    葆宁
  • Java 虚拟机中所有与 GC日志有关的参数

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志。而对于 GC 日志,我们不仅要学会看懂,而且要学会...

    葆宁
  • Java内存模式是什么?

    方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部...

    葆宁
  • 从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

    在阅读这篇文章:Announcing Net Core 3 Preview3的时候,我看到了这样一个特性:

    ShenduCC
  • JVM系列第10讲:垃圾回收的几种类型

    我们经常会听到许多垃圾回收的术语,例如:Minor GC、Major GC、Young GC、Old GC、Full GC、Stop-The-World 等。但...

    陈树义
  • 老公:怎么排查堆内存溢出啊?

    上次给老公们说过了死循环cpu飙高的排查过程,今天就带着老公们看看堆内存溢出我们一般怎么排查的。

    敖丙
  • [三步法] 可视化分析定位线上 JVM 问题

    前提是线上 JVM 配置了以下参数: [题外话:JDK 版本 1.6,现在大部分互联网企业应用系统应该是 1.8 以上了吧 ]

    IT技术小咖
  • 程序员如何优化 Java GC

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作。

    黄泽杰
  • Full GC 和 Minor GC,傻傻分不清楚

    大家可能见到过很多的 GC 名词,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。

    武培轩
  • 经典面试题

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

    cwl_java

扫码关注云+社区

领取腾讯云代金券