我通过链接Java可用的垃圾收集算法来理解可用的JVM垃圾收集算法,结果搞糊涂了。
根据我的理解,会有一些标准的GC算法,不同的JVM供应商实现这些算法来创建垃圾收集器。
现在请帮助我理解以下是算法还是实现算法:
我认为这些是垃圾收集器的类型,它实现了一些特定的算法(我不知道的算法名称)。
另外,我正在阅读在http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf上发布的关于JVM垃圾收集的白皮书,但是无法明确区分垃圾收集算法和垃圾收集器。
其中一些文档提到了“年轻一代垃圾收集算法/老一代垃圾收集算法”。
这是否意味着串行垃圾收集器(垃圾收集器的类型)分别使用“年轻一代垃圾收集算法”和“老一代垃圾收集算法”分别对年轻一代和老一代地区进行GC。
请帮助我清楚地了解算法的类型和垃圾收集器的类型。
发布于 2015-03-31 11:53:36
让我试着解释一下:)
垃圾收集器可以有不同的算法--比如标记和扫描、Mark&等等(通常取决于系统的性能以及应用程序的范围)。应用程序在堆上创建对象。由于这些对象中的大多数都是年轻的,堆将被划分为两个主要区域:年轻一代和老一代。物体总是在年轻的基因中首先着陆。这里有算法,然后将一些对象推广到老一代。因为在老一代中处理对象通常需要很高的性能,所以目标是让对象尽可能早地死去。(这是非常基本的解释-年轻的基因也被分为伊甸园和幸存者空间,所以我试着给出一个简单的概述)。
因此垃圾收集器对不同的基因(年轻人和老年人)使用不同的算法。此外,您不仅要通过算法来分离,还要根据它们的执行方式:串行、并行、Concurrent...etc。
串行
表示垃圾收集器在串行模式下运行。串行模式将被使用,如果你只有在核心。如果使用串行,垃圾收集器将停止世界(stw阶段)并清除堆上的对象。这会降低应用程序的性能。
并行
垃圾收集器以并行模式运行。这种模式利用了多核系统的优点。因此,清理堆的任务在线程中运行。这样,垃圾收集器需要较少的时间来清除堆。但你仍然会有stw阶段,但他们需要较少的时间。
CMS -并发
此垃圾收集器以并发模式运行。因此,在垃圾收集器的某些阶段,任务在应用程序旁边运行。例如,并发Mark & Swepp:
初始标记阶段-系列
标记阶段-并发
备注相位并行
扫描相位-并发
在并发阶段,您将不会有STW阶段。
G1
是SUN开发的一个特殊的垃圾收集器(还是IBM开发的)。目前所有算法都有停止世界阶段.对于G1,他们试图说明这些阶段需要多长时间。这是一个非常复杂的算法,但也是如此,不可能说stw阶段将需要多长时间。
发布于 2015-03-31 17:41:09
我认为这些是垃圾收集器的类型,它实现了一些特定的算法(我不知道的算法名称)。
您列出的内容通常用作Oracle上下文中特定GC实现的名称,其中包含所有特定于实现的详细信息、调优选项等,以及它们带来的其他实际异常。当然,它们也是基于抽象的算法,这些算法可以共享它们的名称,也可以在一些科学出版物中描述,这些算法可以修饰细节,只是对它们的理论行为进行建模。
两者的区别并不总是那么清晰。串行GC是最原始的算法:标记扫描,停止世界,单线程.取决于JVM,它可能是压缩的,也可能不是压缩的。如果我没记错的话,旧版本的android在串行GC实现中没有紧凑。
所以,实际上,命名是特定于上下文的。如果您正在阅读一篇关于并行、紧凑、并发的、无用的收集器的研究论文,它并不是指hotspot的吞吐量(并行老gen)、并行清道夫(并行年轻一代)或parnew (年轻一代的收集器与CMS合作的老一代)收集器,仅仅因为提到了并行这个词。如果您阅读,可能是一篇博客文章,描述了特定GC的性能特征,以及实际的度量--它们可能引用hotspot实现。
这里列出了hotspot的收藏家及其关系,可能因待决JEPs而发生更改
https://stackoverflow.com/questions/29363689
复制相似问题