GC 解释:算法

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(245)   2024-01-14 07:14:57

上一篇文章所述,我们在 HotSpot JVM 中提供了四种不同的垃圾收集器。它们之间存在一些显着差异,但用于完成实际工作的算法背后的实际概念非常相似。在这篇简短的文章中,我将尝试解释三种基本算法:

  • 标记清除
  • 标记清除紧凑
  • 标记复制

GC根

在我们进入细节之前,让我们确保我们对什么是 GC Roots 有一个共同的理解。这些是可从堆外直接访问 的对象。例如:

  • 活跃线程
  • 静态变量
  • 局部变量(可通过线程堆栈访问)
  • JNI 参考

标记

所有讨论的算法都有相同的标记阶段。标记阶段是遍历整个对象图,从 GC Roots 开始。当 GC 访问该对象时,它会将其标记为可访问并因此处于活动状态。所有从 GC Roots 无法到达的对象都是垃圾。标记需要停止世界 (STW) 暂停,因为正在运行的应用程序线程可能会干扰。 STW 停顿多长时间,主要取决于访问对象的数量。

扫标

在标记阶段之后,我们得到了已访问对象(可通过 GC Roots 访问)和未访问对象占用的内存空间。扫描阶段释放包含无法访问的对象的内存碎片。这很简单,但是因为死对象不一定彼此相邻,所以我们最终会得到一个碎片化的内存。这本身并不坏,但试图将太大的对象放入内存可能会导致 OutOfMemoryError

标记清除紧凑

该算法解决了内存碎片问题。所有活着的对象都被标记后,它们被移动到内存空间的开头。这有助于避免因内存过于碎片化而导致的 OutOfMemoryError,但压缩堆并不是免费的。复制对象并更新对它们的所有引用需要时间,并且这一切都发生在 STW 暂停期间。

标记复制

标记复制算法将所有活动对象复制到新的内存区域。先前占用的区域被认为是空闲的。下次执行 mark-copy 时,所有存活的对象都被移回之前的内存区域。可以想象,这当然会导致内存压缩。不幸的是,它需要足够大的额外区域来容纳任何给定时间点的所有活动对象。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-gc-explained-algorithms.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...