文章目录
- JVM原理及调优_垃圾回收器
- 什么是垃圾收集器?
- 垃圾回收器详解
- Serial
- ParNew
- Parallel Scavenge
- Serial Old
- Parallnel old
- CMS
- G1
JVM原理及调优_垃圾回收器
什么是垃圾收集器?
- 垃圾收集器是垃圾回收算法(引用计数法、标记清除法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。
图中展示了7种不同分代的收集器:
Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old、G1
而它们所处区域,则表明其是属于新生代还是老年代的收集器:
- 新生代收集器:Serial、ParNew、Parallel Scavenge
- 老年代收集器:CMS、Serial Old、Parallel Old
- 整堆收集器:G1
两个收集器间有连线,表明它们可以搭配使用:
Serial / Serial Old
Serial / CMS
ParNew / Serial Old
ParNew / CMS
Parallel Scavenge / Serial Old
Parallel Scavenge / Parallel Old
G1
垃圾回收器详解
Serial
Serial 收集器:新生代。发展历史最悠久的收集器。它是一个单线程收集器,它只会使用一个 CPU 或者线程去完成垃圾收集工作,而且在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
特点:
新生代收集器,使用复制算法收集新生代垃圾。
单线程的收集器,GC工作时,其它所有线程都将停止工作。
简单高效,适合单 CPU 环境。单线程没有线程交互的开销,因此拥有最高的单线程收集效率。
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseSerialGC" --添加该参数来显式的使用改垃圾收集器;
ParNew
ParNew 收集器:新生代。Serial 的多线程版本,即同时启动多个线程去进行垃圾收集。
特点:
新生代收集器。ParNew垃圾收集器是Serial收集器的多线程版本,采用复制算法。
除了多线程外,其余的行为、特点和Serial收集器一样。
只有它能与 CMS 收集器配合使用。
但在单个CPU环境中,不比Serail收集器好,多线程使用它比较好。
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseParNewGC" --强制指定使用ParNew;
设置垃圾收集器: "-XX:+UseConcMarkSweepGC" --指定使用CMS后,会默认使用ParNew作为新生代收集器;
设置垃圾收集器参数:"-XX:ParallelGCThreads" --指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
Parallel Scavenge
Parallel Scavenge 收集器:新生代。和 ParNew 的关注点不一样,该收集器更关注吞吐量,尽快地完成计算任务。
特点:
新生代收集器。
采用复制算法。
多线程收集。
与ParNew 不同的是:高吞吐量为目标,(减少垃圾收集时间,让用户代码获得更长的运行时间)
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseParallelGC" --添加该参数来显式的使用改垃圾收集器;
设置垃圾收集器参数:"-XX:MaxGCPauseMillis" --控制垃圾回收时最大的停顿时间(单位ms)
设置垃圾收集器参数:"-XX:GCTimeRatio" --控制程序运行的吞吐量大小吞吐量大小=代码执行时间/(代码执行时间+gc回收的时间)
设置垃圾收集器参数:"-XX:UseAdaptiveSizePolicy" --内存调优交给虚拟机管理
Serial Old
- Serial Old 收集器:Serial 的老年代版本,使用标记 - 整理算法。
特点:
- 老年代收集器, 采用"标记-整理"算法。
- 单线程收集。
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:在JDK1.5及之前,与Parallel Scavenge收集器搭配使用,
在JDK1.6后有Parallel Old收集器可搭配。
现在的作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
Parallnel old
- Parallnel old 收集器,多线程:Parallel 的老年代版本,使用标记 - 整理算法。
特点:
- 针对老年代。
- 采用"标记-整理"算法。
- 多线程收集。
- 但在单个CPU环境中,不比Serial Old收集器好,多线程使用它比较好。
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseParallelOldGC":指定使用Parallel Old收集器;
CMS
- CMS 收集器:老年代。是一种以获取最短回收停顿时间为目标的收集器,适用于互联网站或者 B/S 系统的服务端上。
特点:
- 针对老年代,采用标记-清楚法清除垃圾;
- 基于"标记-清除"算法(不进行压缩操作,产生内存碎片);
- 以获取最短回收停顿时间为目标;
- 并发收集、低停顿;
- CMS收集器有3个明显的缺点:1.对CPU资源非常敏感、2.无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败、3.产生大量内存碎片
- 垃圾收集线程与用户线程(基本上)可以同时工作
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseConcMarkSweepGC":指定使用CMS收集器;
G1
- G1 收集器:分代收集器。当今收集器技术发展最前沿成果之一,是一款面向服务端应用的垃圾收集器。G1可以说是CMS的终极改进版,解决了CMS内存碎片、更多的内存空间登问题。虽然流程与CMS比较相似,但底层的原理已是完全不同。
特点:
- 能充分利用多CPU、多核环境下的硬件优势;
- 可以并行来缩短(Stop The World)停顿时间;
- 也可以并发让垃圾收集与用户程序同时进行;
- 分代收集,收集范围包括新生代和老年代
- 能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
- 能够采用不同方式处理不同时期的对象;
- 应用场景可以面向服务端应用,针对具有大内存、多处理器的机器;
- 采用标记-整理 + 复制算法来回收垃圾
//如何设置JVM参数底下会讲解:这里只是列举一部分参数:设置垃圾收集器:"-XX:+UseG1GC":指定使用G1收集器;
设置垃圾收集器参数:"-XX:InitiatingHeapOccupancyPercent":当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45;
设置垃圾收集器参数:"-XX:MaxGCPauseMillis":为G1设置暂停时间目标,默认值为200毫秒;
设置垃圾收集器参数:"-XX:G1HeapRegionSize":设置每个Region大小,范围1MB到32MB;目标是在最小Java堆时可以拥有约2048个Region