在了解了常见收集算法之后,在收集算法的基础上,垃圾收集器为内存回收的具体实现,
在现在来说JVM通常提供了多个垃圾收集,让用户根据自己的应用特点来组合使用收集器
面对上面的多种收集器的时候,记住一条规则,没有完美的收集器,任何的收集器都需要我们去组合使用(G1可能打破这种大一统的局面)
1.Serial收集器
Serial收集器 一个单线程的收集器,这里的单线程是指其在垃圾回收的时候,必须暂停其他的工作线程,直到其收集结束,简称为Stop the world
举个例子来讲,就是在打扫房间的时候不能有人在捣乱,把你的房间弄得更乱,在实际上,虽然其看似低效,但是还是作为客户端最好的选择,因为对于客户端,其可以专心的做垃圾收集而没有其他的干扰,从而到达一个真正的高效垃圾搜集
2.ParNew收集器
简单来说就是对于Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为基本和Serial收集器基本一致.收集算法和分配规则都一致
工作过程如下
ParNew收集器适合于Server模式下的虚拟机,也是其首选的新生代收集器
使用其可以通过以下指令来使用ParNew
-XX +UseConcMarkSweepGC来指定默认新生代使用Parnew
也可以使用 -XX +UseParNewGC来强制使用
但是其在单线程的情况下,使用效率并没有Serial收集器高,
但是随着可使用CPU数量增加,对于GC的效率就上去了,在Cpu非常多的情况下,使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数
3.Parallel Scanvenge收集器
Parrllel Scavenge收集器是一个新生代收集器,使用复制算法,也是多线程,但是他和ParNew最大的区别在于,关注点不同
一般的收集器是尽可能的缩短垃圾收集时候的用户等待时间,Parallel Scanvege是达到一个可控制的吞吐量
寻常的收集器的停顿时间短适合给用户交互的程序,良好的响应程序能提升用户体验,
但是在一些不经常和用户交互,之在后台自己运行的任务,使用Parallel Scanvege是非常合适的
Parallel Scavenge收集器提供的参数有
设置最大停顿时间的-XX:MaxGCPauseMillis和设置吞吐量的-XX:GCTimeRaatio参数
常见的GCTimeRatio参数是一个大于0且小于100的整数,也就是垃圾收集时间,占总时间的比率
比如 设置19,那么最大时间比为 1/(1+19)为 5%
最后还有一个-XX+UseAdaptiveSizePolicy开关参数,如果是true,就不用指定新生代的大小-Xmn,Eden Survivor区的比例
虚拟机可以自己调控性能监控信息
简单来说就是GC的自适应调节策略(GC Ergonomics)