在了解了常见收集算法之后,在收集算法的基础上,垃圾收集器为内存回收的具体实现,

在现在来说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)

发表评论

邮箱地址不会被公开。 必填项已用*标注