需要帮助来理解可用的JVM“垃圾收集算法”和“垃圾收集器”

时间:2015-03-31 08:09:49

标签: java garbage-collection jvm

我正在浏览链接Java - available garbage collection algorithms以了解可用的JVM垃圾收集算法,并感到困惑。

根据我的理解,将有一些标准的GC算法,不同的JVM供应商实现这些算法来创建垃圾收集器。

现在请帮助我理解下面是算法还是算法实现:

  1. 串行,
  2. 并行,
  3. CMS,
  4. G1,
  5. 我认为这些是垃圾收集器的类型,它实现了一些特定的算法(我不知道的算法名称)。

    此外,我正在阅读http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf上发布的有关JVM垃圾收集的白皮书,但无法明确区分垃圾收集算法和垃圾收集器。

    有些文件提及"年轻代垃圾收集算法/旧代垃圾收集算法"。

    是否意味着串行垃圾收集器(垃圾收集器的类型)使用"年轻一代垃圾收集算法"以及"老一代垃圾收集算法"分别在年轻一代和老一代地区做GC。

    请帮助我清楚地了解算法的类型和垃圾收集器的类型。

2 个答案:

答案 0 :(得分:3)

Uff让我尝试以某种方式解释这个:)

垃圾收集器可以有不同的算法 - 例如Mark& Sweep,Mark& Compact,Reference Counting等 - (通常取决于您的系统的性能以及应用程序的范围)。 应用程序在堆上创建对象。 由于大多数这些对象都很年轻,因此堆将分为两个主要区域: 年轻一代和老一代。 物体总是首先落在年轻的基因中。在那里你有算法,然后将一些对象推广到老一代。 因为处理旧代中的对象通常需要很多性能,所以目标是让对象尽可能年轻。 (这解释得非常基本 - 年轻的生成也分为伊甸园和幸存者空间 - 所以我试着给出一个简单的概述。)

因此垃圾收集器对不同的子类(年轻人和老年人)使用不同的算法。 此外,您不仅要按算法分隔,还要按执行方式分离: 串行,并行,并发......等。

<强>串行

表示垃圾收集器以串行模式运行。如果您只有核心,将使用串行模式。如果使用serial,则垃圾收集器会停止世界(stw阶段)并清除堆上的对象。 这可能会降低应用程序的性能。

<强>并行

垃圾收集器以并行方式运行。此模式使用多核系统的优势。因此,清理堆的任务是在线程中运行的。这样垃圾收集器需要更少的时间来清除堆。但是你仍然会有阶段但是他们花费的时间更少。

CMS - 并发

此垃圾收集器以并发方式运行。 因此,在垃圾收集器的某些阶段,任务在应用程序旁边运行。 例如Concurrent Mark&amp; Swepp:

初始标记阶段 - 序列

标记阶段 - 并发

备注阶段 - 并行

扫描阶段 - 并发

在并发阶段,您将没有STW阶段。

<强> G1

是SUN开发的特殊垃圾收集器(还是IBM?)。 目前,所有算法都有Stop-The-World - Phases。 他们试图说明这些阶段需要多长时间。 这是一个非常复杂的算法,但也有这个,不可能说明stw阶段需要多长时间。

答案 1 :(得分:2)

  

我认为这些是垃圾收集器的类型,它实现了一些特定的算法(我不知道的算法名称)。

您列出的那些通常用作Oracle HotSpot JVM上下文中特定GC实现的名称,包括所有特定于实现的细节,调整选项等以及它们带来的其他现实怪异。 当然,它们也是基于抽象算法,这些算法可以分享它们的名字,或者可以在一些科学出版物中描述,这些出版物掩盖了细节,只是模拟了它们的理论行为。

区别并不总是那么明确。串行GC是最原始的算法:标记扫描,停止世界,单线程。根据JVM,它可能会也可能不会压缩。如果我没记错的话,老式的VM VM在串行GC实现中并不紧凑。

实际上,命名法是特定于上下文的。如果您正在阅读关于 parallel ,压缩,并发,无间接收器的研究论文,则不会引用热点的吞吐量(并行旧版),并行清除(并行年轻代) )或者parnew(年轻一代收集器与CMS合作为老一代)收集器,因为提到了并行这个词。 如果您阅读,可能是博客文章,描述特定GC的性能特征和实际测量,他们可能会参考热点实现。

Here's a list of hotspot's collectors and their relations,可能会因pending JEPs

而发生变化