了解垃圾收集器

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

垃圾收集器是指一种自动的内存管理工具,用于在动态分配的内存中自动回收不再使用的对象,释放内存空间。在Java中,垃圾收集器是用来寻找和标记不再使用的对象,并将这些对象回收以释放内存。Java的垃圾收集器是基于对象的引用计数和标记-清除算法实现的。当Java程序中创建了一个新对象,该对象就被分配到堆内存中。在程序运行期间,垃圾收集器会周期性地检查堆中的对象,如果一个对象不再被引用,那么它就会被标记为垃圾并被回收。

1

垃圾收集器

1258f9d4634f233882a9996db61edb7b.png

首先明确一点,不同的 Jdk 版本具有不同的虚拟机垃圾收集器,JVM 垃圾收集器主要有 7 种,如下图:

了解垃圾收集器_第1张图片

两个收集器之间有连线表示 Young GC 和 Old GC 可以搭配使用。

总体上可以把 Java 的垃圾收集器分为 3 类:

串行垃圾收集器(Serial Garbage Collector):Serial,Serial Old,只能有一个垃圾回收线程执行,当垃圾回收线程执行时,用户线程处于等待状态,适用于内存比较小的单 CPU 嵌入式设备。

并行垃圾收集器(Parallel Garbage Collector):ParNew、Parallel Scanvenge、Parallel Old,多个垃圾回收线程并行工作,当垃圾回收线程执行时,用户线程仍然处于等待状态, 适用于大量计算、后台处理等交互场景。

并发收集器(Concurrent Garbage Collector):CMS,G-First,用户线程和垃圾回收线程同时执行,当垃圾回收线程执行时,不会暂停用户线程的运行,适用于对用户请求响应时间有要求的场景,比如 Web 应用。

新生代收集器有:Serial、ParNew、Parallel Scavenge,老年代收集器有:Serial Old、Parallel Old、CMS,G-First 适用于新生代和老年代。

用一个表格来进一步说明 7 种垃圾收集器:

了解垃圾收集器_第2张图片

2

了解 G-First 垃圾收集器

16f17367c43a0d8fe4835936e1c879a3.png

G1(Garbage-First)是 JDK7-u4 才推出商用的收集器,他比 CMS 更高级了,支持并行与并发,能充分利用多 CPU、多核环境的硬件优势,可以设置在一个时间片段内消耗在垃圾收集上的时间不得超过一个指定的毫秒值。使用 G1 收集器时,Java 堆的内存布局与与其他收集器有很大差别,它将整个 Java 堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分 Region(不需要连续)的集合。

目前 JDK8 应用最广泛,JDK9、JDK10是一个过度版,应用较少,JDK11 是的一个里程碑版本,重要程度相当于JDK8,JDK11 默认使用 G1 收集器,同时引入了 ZGC(Z Garbage Collector),ZGC 收集器是基于 Region 内存布局,使用读屏障,着色指针和内存多重映射等技术来实现并发的标记整理算法,以低延迟为目标的一款收集器。

G1 垃圾收集过程:

初始标记(Initial Marking) :标记与 GC Roots 直接关联的对象,启动一个初始标记线程进行初始标记,停止所有用户线程,这个过程很短。

并发标记(Concurrent Marking):进行全面的可达性分析,找出存活对象,标记线程与用户线程并发执行,这个过程比较长,但是这个并发标记过程不会中断用户线程执行,所以对性能影响较小。

最终标记(Final Marking):启动多个最终标记线程并行执行,标记出并发标记过程中用户线程新产生的垃圾,停止所有用户线程,这个过程很短。

筛选回收(Live Data Counting and Evacuation):启动多个筛选回收线程并行执行,对各个 Region 的回收价值和成本进行排序,根据用户所期望的GC 停顿时间制定回收计划,回收标记过的垃圾对象,此时也需要停止所有用户线程,这个过程很短。

G1 垃圾收集过程如下图:

了解垃圾收集器_第3张图片

3

如何选择合适的垃圾收集器

17bb1b21aae7404817621342aff6da71.png

官网链接:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html#sthref28

开启串行收集器

  -XX:+UseSerialGC

  -XX:+UseSerialOldGC

开启并行收集器(吞吐量优先)

  -XX:+UseParallelGC

  -XX:+UseParallelOldGC

开启并发收集器(响应时间优先)

  -XX:+UseConcMarkSweepGC

  -XX:+UseG1GC

了解垃圾收集器_第4张图片

后面将为大家介绍 JVM 的参数及配置。

你可能感兴趣的:(jvm)