垃圾收集算法 是内存回收的 方法,垃圾收集器 则是内存回收的 实现。
收集器没有最好的没有万能的,只有最合适的。
垃圾收集器
图中展示了JDK8之后,HotSpot所有虚拟机的收集器:
7种不同分代的收集器:
新生代收集器: Serial、ParNew、Parallel Scavenge
老年代收集器: CMS、Serial Old、Parallel Old
整堆收集器: G1两个收集器间有连线,表明可以搭配使用。
Minor GC与 Full GC
Minor GC又称为新生代GC。
因为新生代对象大多朝生夕灭,所以Minor GC发生频繁,回收速度快。
Full GC/Major GC又称为老年代GC。
发生经常会伴随至少依次Minor GC。回收速度慢,比Minor GC慢10倍以上。
Serial收集器
Serial收集器是最基本、发展历史最悠久的收集器。
Serial收集器工作流程
特点:
针对新生代
采用复制算法
单线程收集器,GC时暂停所有其他工作线程(Stop The World,“都给我停!”)
优点: 简单而高效(与其他单线程收集器相比)
对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率
在桌面应用场景下,分配给虚拟机的内存不大,收集几十兆新生代内存可控制在几十毫秒内,停顿可以接受
缺点: 停顿导致用户体验差
应用: 是HotSpot在Client模式下的默认的新生代收集器。
参数:
+XX:+UseSerialGC:使用串行收集器。
ParNew收集器
ParNew收集器是Serial收集器的多线程版本。
ParNew收集器工作流程
特点:
针对新生代
采用复制算法
多线程并行
与Serial共有了很多代码,行为、特点和Serial收集器一样
并行(Parallel) 与 并发(Concurrent):
并行:多条垃圾收集线程同时工作,用户线程处于等待。如ParNew、Parallel Scavenge、Parallel Old。
并发:用户线程与垃圾收集线程同时执行(不一定并行,可能交替执行),用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。如CMS、G1。
应用:
虚拟机在Server模式下的首选收集器。
因为除Serial外,只有ParNew收集器可以和CMS配合工作。
因为Parallel Scavenge收集器以及G1收集器没有使用传统GC收集器代码框架,而是独立实现。而CMS与ParNew等其余收集器则共用部分框架代码。
参数:
"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器。
"-XX:+UseParNewGC":强制使用ParNew。
"-XX:ParallelGCThreads":并行线程数量。
Parallel Scanvenge收集器
Parallel Scavenge收集器也被称为 “吞吐量优先” 收集器。
Parallel Scavenge收集器工作流程
特点:
针对新生代
采用复制算法
多线程并行
GC时目标为达到一个可控制的吞吐量(Throughput)
吞吐量 = 用户代码运行时间 / ( 用户代码运行时间 + 垃圾收集时间 )
高吞吐量可以高效利用CPU时间,尽快完成程序运算,主要适合在后台运算而不需要太多交互的任务。
参数:
"-XX:MaxGCPauseMillis":设置最大GC停顿时间。数值越小,GC越频繁,吞吐量越小。
"-XX:GCTimeRatio":设置GC占总时间的比率。默认GC时间权重为1,参数设定用户代码运行时间权重n。吞吐量计算方式为 n / (1 + n)。
"-XX:UseAdaptiveSizePolicy":动态调节新老生代参数,以提供合适的停顿时间或最大吞吐量。即GC自适应调节策略。
Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本。
Serial Old收集器工作流程
特点:
针对老年代
采用”标记-整理“算法(Mark-Compact)
单线程收集
应用:
主要用于Client模式。
在Server模式下,JDK1.5之前,用于搭配Parallel Scavenge使用;作为CMS的后备,在并发收集发生Concurrent Mode Failure时使用。
Parallel Old收集器
Parallel Old垃圾收集器是Parallel Scavenge收集器的老年代版本。
作者:weberweber
链接:https://www.jianshu.com/p/c5c04a7f103c