JVM中垃圾收集器Garbage Collector
《Java Performance: The Definitive Guide》
serial garbage collector
运行在client-class(32-bit JVMs on Windows或者single-processor machines)机器上默认的垃圾收集器, serial collector只使用单个线程去处理heap,在处理heap的时候会暂停所有的应用线程(对于minor gc和full gc也一样),在full gc的时候,会完全压缩老年代(old generation)
可以通过-XX:+UseSerialGC
启动serial collector,不像其他JVM中的flag,serial collector不能通过将+
号变成-
号被禁用(即-XX:-UseSerialGC
),在以serial collector为默认收集器的机器上,需要通过指定其他不同的垃圾收集器去禁用serial collector
throughput collector
运行在server-class(multi-CPU Unix machines, and any 64-bit JVM)机器上默认的垃圾收集器。 throughput collector使用多线程去收集年轻代,使得在minor gc的时候比serial collector更快。throughput collector也可以使用多线程去处理老年代。因为是使用多线程的原因,所以throughput collector也被叫做parallel collector。throughput collector在minor gc和full gc的时候会暂停所有应用线程,而且在full gc的时候会完全压缩老年代。虽然在大多数的情况下是默认的,但是也可以显示的指定。可以通过-XX:+UseParallelGC -XX:+UseParallelOldGC
去启用throughput collector
CMS collector
CMS collector设计用来淘汰throughput collector和serial collector在full gc期间长时间的暂停。CMS在minor gc的时候使用多线程,并且也会暂停所有的应用线程。尤其,CMS collector在年轻代使用-XX:+UseParNewGC
,而不是thoughput collector使用的-XX:+UseParallelGC
在full gc期间,CMS使用一个或者多个线程在后台周期性的扫描老年代和丢弃不再使用的对象(discard objects)来代替暂停所有的应用线程,这使得CMS是一个低停顿的收集器:应用线程只有在minor gc的时候被停顿,而且在这个短暂的停顿时间,后台线程也可以在扫描老年代。总的来说,应用线程停顿时间比throughput collector要少的多
而这样的代价就是需要增加CPU的使用: 这就要求在应用线程在运行的时候,运行在后台的GC 线程要有足够的CPU可用来扫描heap。还有,后台运行的GC线程并不会执行压缩heap,这就意味着heap会变的有很多内存碎片。如果CMS后台GC线程没有获取到CPU时间片去完成任务,或者heap变得零散以至于不能为对象分配内存空间,CMS collector的行为将会变成和serial collector一样,所有的应用线程会被停顿,并且使用单线程去clean和压缩老年代,之后又变得并发的在后台处理,直到下一次heap中的内存变得零散
可以使用-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
来启动CMS collector,然而在默认的情况下是关闭的
G1 collector
G1(Garbage First) collector被设计来处理更大的heap(大于4GB)并且拥有更低的停顿。它将heap分成许多regions
,但它还是属于分代垃圾收集器。其中的一些regions包含了年轻代,并且仍然通过停顿所有的应用线程来达到对年轻代的垃圾收集,将所有的存活对象移动到老年代或者是幸存区(survivor space)。在其他的算法中,是通过多线程实现的。
G1是一个并发的收集器:老年代的是通过后台线程处理的,并且不需要停顿应用线程来完成必要的工作,因为老年代也被分成了许多regions,G1清理老年代对象是通过从一个region复制到另一个region,也就是说,在处理的过程中压缩了整个heap。因此,G1收集器很少会产生内存碎片–尽管有可能
像CMS一样,避免full gc的代价就是CPU时间片:在应用线程运行的时候,后台线程必须要有足够的CPU时间片,G1收集器可以通过-XX:+UseG1GC
来启动(默认是关闭的false)