Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。
图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。
一、概念理解
1. 并发和并行
- 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
- 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。
2. Minor GC 和 Full GC
- Minor GC:指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
- Full GC:指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。
3. 吞吐量
吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)。
虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
4. client模式 和 server模式
- client模式:应用于桌面应用程序。-client 参数指定启动java程序。优点:启动速度快。
- server:应用于服务端应用程序。-server 参数指定启动java程序。特点:启动慢,运行快。
二、串行分类器(Serial)
-
特性:这个收集器是一个
单线程
的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。Stop The World
- 应用场景:Serial收集器是虚拟机运行在Client模式下的默认新生代收集器,最适用于应用程序的内存使用少于100MB的场景(少于100MB,并行和并发收集器起不了太大的性能提升)。
- 优势:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
三、并行分类器(Parallel/Throughput)
Parallel Scavenge收集器 ,ParNew收集器,Parallel Old收集器
-
特性:Throughput收集器使用多线程回收新生代空间和老年代空间,GC速度比Serial收集器快得多,Throughput收集器在Minor GC 和 Full GC时会暂停所有应用线程 ,直到它收集结束。
Stop The World
- 应用场景:Throughput收集器是Server级虚拟机(多CPU的Unix机器以及任何64位虚拟机)的默认收集器,停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
- 优势:使用Throughput收集器处理应用程序线程的批量任务能最大程度的利用CPU的处理能力,通常能获得更好的性能。
四、CMS收集器
- 特性:Cms收集器是一种以获取最短回收停顿时间为目标的收集器。
- 应用场景:目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
- 优势:并发收集、低停顿。应用程序只在Minor GC以及后台线程扫描老年代时发生极其短暂的停顿。
- 缺点:
- CMS收集器对CPU资源非常敏感
其实,面向并发设计的程序都对CPU资源比较敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。
CMS默认启动的回收线程数是(CPU数量+3)/ 4,也就是当CPU在4个以上时,并发回收时垃圾收集线 程不少于25%的CPU资源,并且随着CPU数量的增加而下降。但是当CPU不足4个(譬如2个)时,CMS对用户程序的影响就可能变得很大。
如果CMS的后台垃圾收集线程无法获得完成他们任务所需的CPU资源,或者如果堆变得过度碎片化以至于无法找到连续空间分配对象,CMS就蜕变到Serial收集器的行为:暂停所有应用线程,使用单线程回收,整理老年代空间。
- CMS收集器无法处理浮动垃圾
CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为“浮动垃圾”。
也是由于在垃圾收集阶段用户线程还需要运行,那也就还需要预留有足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分空间提供并发收集时的程序运作使用。要是CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent Mode Failure”失败,这时虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。
- CMS收集器会产生大量空间碎片
CMS是一款基于“标记—清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。
五、G1收集器
- 特性:G1收集器也是一种并发收集器。设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。
- 应用场景:目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
- 优势:G1从整体来看是基于“标记—整理”算法实现的收集器。G1的设计理念使得它比CMS更不容易遭遇Full GC。
六、总结
Serial收集器:最适用于应用程序的内存使用少于100MB的场景。
Throughput收集器:如果平均响应时间比最大响应时间更重要(譬如90%的响应时间),采用Throghput收集器通常就能满足。如果目标是要尽可能的缩短响应时间,那么选择使用Concurrent收集器更合适。Concurrent收集器的前提条件是CPU足够强劲。
Concurrent收集器:一般情况下,堆空间小于4GB时,CMS收集器的性能比G1收集器好。使用大型堆或者巨型堆时,由于G1收集器可以分割工作,通常它比CMS收集器表现更好。
相关推荐
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
【JVM垃圾收集器概述】 Java虚拟机(JVM)的垃圾收集器是自动管理内存的重要组成部分,负责识别不再使用的对象并释放它们所占用的内存,以防止内存泄漏。垃圾收集器的选择和配置对应用程序的性能有着显著影响,特别...
最后,JVM中提供了多种垃圾收集器,如Serial、Parallel、CMS、G1等,每种收集器都有其适用的场景和特点。例如,Serial收集器是单线程的,适用于小内存环境;而CMS(Concurrent Mark Sweep)收集器是追求低停顿时间的...
【JVM垃圾收集器详解】 Java虚拟机(JVM)中的垃圾收集器是负责自动管理内存,特别是Java堆和方法区中的对象实例。它的主要任务是识别并清理不再使用的对象,以便释放内存资源。垃圾收集涉及到三个核心问题:确定...
深入理解JVM内存分配、垃圾收集(Garbage Collection, GC)原理以及垃圾收集器的工作方式对于优化程序性能至关重要。 首先,我们要了解JVM内存结构。在Java中,内存主要分为以下几个区域: 1. **堆内存(Heap)**...
本篇文章主要探讨的是两种高级垃圾收集器:CMS(Concurrent Mark Sweep)收集器和G1(Garbage-First)收集器。 CMS收集器以最小化应用程序停顿时间为目标,适用于对响应时间要求严格的互联网或B/S系统服务端。它...
它不仅向读者提供了JVM垃圾收集机制的理论知识,还提供了实操指导,比如如何选择和调优垃圾收集器以及使用哪些工具来评估垃圾收集器性能。对于开发人员来说,掌握这些知识可以帮助他们编写出性能更优、稳定性更高的...
G1垃圾收集器是Java虚拟机(JVM)的一部分,它引入了区域(Region)的概念,将堆内存划分为多个固定大小的区域,并采用分代收集策略。 在G1收集器的工作流程中,区域可以被分为新生代(Young Generation)、老年代...
### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 ...特别是在Java应用中,合理配置和优化JVM的垃圾收集器是提高系统性能的关键之一。通过对GC的深入理解以及合理的调优策略,可以显著提升Java应用的整体性能表现。
1. **对象的可达性分析**:垃圾收集器通过一系列的可达性分析算法,如引用计数法或根可达算法,来判断哪些对象是“活动的”(即仍然被程序中的其他对象引用),哪些是“无用的”(没有被任何活动部分引用)。...
- **垃圾收集器**:JVM使用不同的垃圾收集器策略,如分代收集、标记-清除、复制、标记-压缩等,来优化内存管理。分代收集将堆分为年轻代和老年代,以适应不同生命周期的对象。 - **可达性分析**:垃圾收集器通过...
- **JVM参数**:为了更好地控制JVM的行为,可以使用一系列命令行参数,如设置初始堆大小(-Xms)、最大堆大小(-Xmx)、启用特定的垃圾收集器(-XX:+UseG1GC)等。这些参数对于优化应用性能至关重要。 通过深入理解...
JVM还提供了多种垃圾收集器,如Serial、Parallel、CMS、G1和ZGC等,它们各有优缺点,适用于不同的场景。 5. **内存模型(Java Memory Model, JMM)** JMM规定了线程如何访问和修改共享变量,确保并发程序的正确性...
常见的JVM垃圾收集器包括: - Serial收集器:单线程,适合小型应用。 - ParNew收集器:Serial的多线程版本,常与CMS配合。 - Parallel Scavenge:关注吞吐量,适用于服务器环境。 - Serial Old、Parallel Old:...
**G1垃圾收集器**是Java虚拟机(JVM)的一种高效、低延迟的垃圾回收器,主要设计用于服务端的应用,特别是在多处理器和大内存环境中。G1自JDK7开始支持,其目标是在满足可预测的暂停时间的同时,保持较高的整体吞吐...
Java垃圾回收(GC)机制是Java虚拟机...总结来说,GC机制是JVM中自动内存管理的关键技术,它包含多种算法和垃圾收集器。通过合理设置GC参数和选择合适的垃圾收集器,可以有效提升应用性能,减少垃圾收集对业务的影响。
2. **垃圾收集器选择**:JVM提供了多种垃圾收集器,如Serial、Parallel、CMS、G1等。每种收集器有不同的性能特点,根据应用类型和硬件配置选择合适的组合,如低延迟应用可选CMS或G1,而服务器应用则可能更适合...
在JVM中,垃圾收集器(Garbage Collector,简称GC)会追踪所有活跃对象(正在使用中的对象),并将剩余的对象视为垃圾(即不可达对象),通过一系列算法来决定何时、如何回收这些垃圾对象。 ### GC算法 GC算法包括...
当一个对象不再被任何变量引用时,该对象就会被视为垃圾,随后会被垃圾收集器回收。常见的垃圾收集算法包括标记-清除算法、复制算法、标记-整理算法等。 #### 3.2 垃圾收集器种类 - **Serial收集器**:单线程收集器...
除了上述技术上的改进外,Java虚拟机中的垃圾收集器还引入了一系列工效特性,如自适应调整策略等,以帮助开发者更好地监控和调优垃圾收集过程。例如,通过监控应用程序的运行状态,自动调整垃圾收集器的行为,以满足...