💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### G1(Garbage First) G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出(去除了其Experimental的标识),相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248) > G1的设计发展思路是:**在延迟可控的情况下,获得尽可能高的吞吐量** > JDK9之后取代Parallel Scavenge + Parallel Old以及CMS作为JDK默认的垃圾处理器,在JDK9之前需要使用-XX:+UseG1GC来开启使用 G1是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。它是专门针对以下应用场景设计的: * 像CMS收集器一样,能与应用程序线程并发执行 * 整理空闲空间更快 * 需要GC停顿时间更好预测 * 不希望牺牲大量的吞吐性能 * 不需要更大的Java Heap > G1目前是主流的垃圾收集器,虽然未来可能会有ZGC转正,来替代G1,但是目前来看,其仍是未来一段时间的主力垃圾收集器 #### 特性 * 面向服务端应用的垃圾收集器 * **并行与并发:**G1能充分利用多CPU、多核环境使用多个CPU或CPU核心来缩短Stop-The-World停顿时间 * 分代收集 * 空间整合:不会产生内存空间碎片,收集后可提供规整的可用内存,整理空闲空间更快 * 可预测的停顿\(它可以有计划的避免在整个JAVA堆中进行全区域的垃圾收集\) * G1跟踪各个region中的垃圾的堆积的“价值”大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,根据每次允许的收集时间,优先回收价值最大的region * JAVA堆内存布局与其它收集器存在很大差别,它将整个JAVA堆划分为多个大小相等的独立区域(Region),虽然还保留了新生代和老年代的概念,但新生代和老年代不再是物理隔离,它们都是一部分Region\(不需要连续\)的集合 * G1收集器中,虚拟机使用Remembered Set来避免全堆扫描 ## 并行与并发 * 并行性:G1在垃圾回收过程中,可以又多个GC线程同时工作,有效的利用CPU的多核处理能力,此时程序线程STW * 并发性:G1拥有和程序线程交替执行的能力,部分工作可以和应用程序同时执行,所以一般来讲,不会在整个垃圾回收阶段发生程序线程完全阻塞的情况 #### 运作步骤 * 初始标记:Initial Marking * 并发标记:Concurrent Marking * 最终标记:Final Marking * 筛选回收:Live Data Counting And Evacuation ***** 【参考资料】 【美团--Java Hotspot G1 GC的一些关键技术】-- [https://tech.meituan.com/g1.html](#)