一、简介
在新生代和老年代进行垃圾回收的时候,都需要使用回收器进行回收,不同的JVM 垃圾回收器会有所不同,不同区域一般也采用不同的垃圾回收器。JVM常见的垃圾回收器有以下几种,我们先来简要看下,后续会针对每一种GC专门详细讲解:
Serial/Serial Old
Serial/Serial Old收集器是最基本也是最古老的垃圾收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程,也就是发生“Stop the World”。一般JVM都不再使用该收集器。
ParNew
ParNew收集器是Serial收集器的多线程版本。新生代并行回收,采用复制算法,老年代串行回收,采用标记整理算法。所以,该收集器一般只用于新生代。
CMS
CMS(Current Mark Sweep)收集器,目标是使回收停顿时间最短,也是多线程机制,采用标记整理算法,该回收器一般用于老年代,生产环境上也经常会使用该垃圾回收器与其它GC搭配使用。
G1
G1最大的特点是没有物理上的新生代和老年代,它们是逻辑的,G1将整个Java堆划分为多个大小相等的独立区域(Region),对新生代和老年代进行统一收集,并且采用了更加优秀的算法和设计机制。
二、Stop the World
2.1 何谓Stop the World
上一节,我们提到过JVM在进行垃圾回收时,会挂起除GC线程以外的所有其它线程,这就会导致系统出现卡顿,这就是JVM所谓的 Stop the World 机制。
假设当前JVM新生代的状态如下,Eden区已被填满,Survivor1区存放着上一次Minor GC后的存活对象,这时候即将触发Minor GC,由垃圾回收线程使用垃圾回收器(新生代一般使用ParNew,采用复制算法),使用特定的垃圾回收算法进行回收,如下图:
回收时,Eden区和Survivor1区的存活对象会被转移到Survivor2区,接着Eden和Survivor1中的垃圾对象都会被回收掉:
JVM在进行垃圾回收时,会让我们的系统暂停,不再创建新的对象,同时让GC线程尽快完成垃圾回收的工作——即标记和转移存活对象:
一旦本轮GC结束,就可以恢复我们的系统程序,继续在Eden区创建新的对象了,如下图:
三、总结
上面就是 Stop the World 的整体流程,Stop the World会导致客户端的请求出现卡顿,短则几百毫秒,长则几秒甚至几分钟。所以,无论是Minor GC还是Full GC,都要避免频率过高,这也是使用JVM过程中最需要关注和优化的地方。
从下一章开始,我们将详细讲解常见的三种垃圾回收器的工作原理,不同回收器 Stop the World 的流程也有所区别,GC的核心目标其实就是降低 Stop the World 的总体时间,这也是JVM不断演化的终极思路。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。