gc垃圾收集器 与gc算法
当前版本的HotSpot JVM包括三种类型的垃圾收集器:
–串行收集器
–并行收集器
–多数同时收集者
它们都是世代的,这意味着它们利用了堆的划分方式 。
垃圾收集器负责三个主要操作:
–查找不再使用的对象
–释放这些对象之后的内存
–压缩堆
并非所有收集器都以相同的方式执行这些操作,因此让我们了解有关所有收集器的基本信息。 我们将在单独的文章中介绍细节。
串行收集器
顾名思义,收集仅由一个线程执行。 在次要和完全GC期间都必须停止世界(STW)。
该收集器对年轻一代使用标记复制算法,而对旧一代使用标记清除紧凑算法进行清理。
串行GC专为单线程环境(通常是客户端类计算机)和较小的堆而设计。 可以通过-XX:+UseSerialGC
标志启用它。
并行(吞吐量)收集器
Young集合由多个线程并行化,这使Minor GC更快。 结果,该收集器导致较短但更频繁的Young收集STW暂停。 从JDK 7u4开始,默认情况下还会由多个线程收集“旧世代”(并且还会导致世界停顿)。 在JDK 7u4之前,需要-XX:+UseParallelOldGC
标志来启用旧一代的并行处理。 现在, -XX:+UseParallelGC
和-XX:+UseParallelOldGC
标志都启用了吞吐量收集器,并同时处理了老一代和年轻一代。
该收集器还在Young Generation中使用mark-copy算法,在Old Generation中使用mark-sweep-compact,但是复制和压缩阶段均由多个线程执行。
要配置GC线程数,可以使用-XX:ParallelGCThreads=X
标志。 默认值设置为CPU内核数。
什么时候使用并行GC是个好选择? 好吧,基本上,只要吞吐量比延迟更重要。
多数同时收集者
它们被称为低暂停收集器-旨在最大程度地减少停顿的暂停并保持应用程序尽可能的响应
并发标记和扫描(CMS)
使用并行标记复制算法在多个线程中执行次要GC。 然后将停止所有应用程序线程。 老式服务器通常是同时收集的-当后台GC线程扫描老式服务器时,应用程序线程会暂停很短的时间。 Major GC期间使用的实际算法是并发标记扫描。 您可能已经注意到,“扫描”之后没有“压缩”。 没错–并发标记和清除是不会压缩使用权空间的收集器,因此内存可能会碎片化。 由于缺乏堆压缩,当GC无法将新对象放入内存时,JVM会回退到串行mark-sweep-compact算法以对旧版本进行碎片整理和压缩。 那就是性能下降到来的时候–所有应用程序线程都停止了,只有一个线程负责清理和压缩Tenured空间。
如前所述,CMS是低暂停收集器的一个示例。 这意味着当延迟是主要目标而不是吞吐量时,这是一个不错的选择-因为吞吐量可能由于CPU消耗的增加而降低(在应用程序线程运行时扫描堆不是免费的)。
-XX:+UseConcMarkSweepGC
启用CMS收集器。 以前可以使用-XX:-UseParNewGC
(单号“ UseParNewGC”之前减去-,因此请使用此标记来禁用Parallel New(Young)GC)来配置具有单线程Young Generation集合的CMS,但已弃用在Java 8中已删除,在Java 9中已删除。
G1GC
垃圾优先(G1)是一种新的低中断垃圾收集器,旨在处理具有最小暂停的大型堆。 堆分为固定大小的几个区域(同时仍保持堆的世代性质)。 这种设计使我们在处理整个“年轻一代”或“老一代”时摆脱了较长的STW暂停。 现在,可以分别收集每个区域,这将导致更短但更频繁的STW暂停。 G1将对象从一个区域复制到另一个区域,这意味着堆至少已部分压缩。
G1使用mark-sweep-compact算法的增量版本。 可以通过指定-XX:+UseG1GC
标志来启用它。
摘要
这是本文讨论的收集器的简单比较:
集电极 | 多个GC线程 | STW(年轻一代) | STW(老一代) | 堆压实 | 首要目标 |
---|---|---|---|---|---|
序列号 | 没有 | 是 | 是 | 是 | – |
平行 | 是 | 是 | 是 | 是 | 通量 |
不育系 | 是 | 是 | 仅在扫描期间 | 没有 | 潜伏 |
G1 | 是 | 是 | 很短的 | 部分地 | 潜伏 |
还有一些其他垃圾收集器,但它们不是HotSpot JVM的一部分。 这些是:
- C4(Azul Zing JVM)
- 雪兰多
- 平衡(IBM J9 JVM)
在Java 8中,服务器级计算机的默认GC是Parallel Collector。 G1GC在Java 9中将是默认的。默认情况下,客户端类计算机运行Serial Collector。
翻译自: https://www.javacodegeeks.com/2017/09/gc-explained-collectors-overview.html
gc垃圾收集器 与gc算法