当前位置: 首页 > 知识库问答 >
问题:

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

慎建本
2023-03-14

为了理解可用的JVM垃圾收集算法,我在查看java-available垃圾收集算法链接时感到困惑。

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

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

  1. 序列,
  2. 平行,
  3. CMS,
  4. G1,

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

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

请帮我弄清楚算法的类型和垃圾收集器的类型。

共有1个答案

江永安
2023-03-14

让我试着解释一下:)

垃圾收集器可以有不同的算法--例如mark&sweep、mark&compact、引用计数等--(通常由系统的性能和应用程序的范围决定)。应用程序在堆上创建对象。由于这些对象大多很早就死亡了,所以堆将被分成两个主要区域:年轻一代和老一代。对象总是首先在年轻的geneartion中着陆。在那里,你有算法,然后将一些对象提升到老一代。因为处理老一代中的对象通常需要大量的性能,所以目标是让对象尽可能年轻地死去。(这是非常基本的解释--年轻的起源也分为伊甸园和幸存者空间--所以我试着给出一个简单的概述)。

因此,垃圾收集器对不同的genears(年轻的和老的)使用不同的算法。此外,你不仅要根据算法来区分,还要根据它们的执行方式来区分:串行、并行、并发……等等。

连载

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

平行

初始标记相位-串行

标记相位并发

注:相位并联

 类似资料:
  • 一、垃圾收集算法 1.标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法分为“标记”和“清除”两个阶段。 ①首先标记出所有需要回收的对象 ②在标记完成后统一回收所有被标记的对象。 不足: 效率问题:标记和清除两个过程的效率都不高 空间问题:标记清除之后产生大量不连续的内存碎片,空间碎片太多可能会导致以后程序运行过程中需要分配较大对象时,无法找到足够

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 问题内容: 有谁知道适当的资源来阅读Java中可用的垃圾收集机制?到目前为止,我发现了几个网站,但是它们没有包含有关何时使用哪种实现以及什么是实现的全面描述。(我指的是Oracle的jdk) 问题答案: 到目前为止,Java Hotspot VM中提供了4种GC算法: 该 系列GC -建议对不具备低暂停时间要求的客户风格的应用程序。 在 并行GC -使用时的吞吐量事项。 在 大多并发GC (也称为

  • 问题内容: 我想触发许多一次性异步CompletableFutures,例如: 理想情况下,可以在完成后将这些CompletableFutures进行垃圾回收。但是,由于我没有存储参考文献,因此是否有事先收集它们的风险? 问题答案: 您不是在显式地存储引用,而是在内部。该方法创建一个,然后向其提交引用的任务(如果您使用的是公共池)。在返回的变成了依赖于第一,因此也被引用。 一旦完成的执行,将第一个

  • 问题内容: 是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。 假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的: 当Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()? 我在这里有意义吗? 也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄