JVM垃圾收集器

本文详细介绍了JVM中的四种主要垃圾收集器:serial、throughput、CMS和G1。serial收集器适用于32位JVM,使用单线程进行垃圾回收;throughput收集器在多核机器上默认使用,通过多线程提高年轻代垃圾回收速度;CMS收集器旨在减少full gc的停顿时间,采用后台线程周期性扫描老年代;G1收集器专为大堆设计,通过并发处理老年代并避免内存碎片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值