Java 垃圾收集是否总是必须“停止世界”?

2024-04-06

我正在尝试更深入地了解Java的垃圾收集。

在HotSpot JVM分代收集中,堆中分为三个区域(年轻代、老年代和永久代)。另外,还有两种算法:

1) 标记扫描紧凑型.

2) 并发标记和清除.

GC 是否需要“Stop-the-world”取决于它使用的算法而不是它运行在哪一代上,这是真的吗?换句话说,如果我在所有三个区域上使用 1) 作为 GC 算法,STW 总会发生吗?

另外,我理解的区别是第二个 GC 算法不需要压缩,这最终会导致碎片。那么第二个问题就来了,为什么compaction需要STW暂停?


压缩导致 STW 暂停的关键原因如下,JVM 需要移动对象并更新对其的引用。现在,如果您在更新引用之前移动对象,并且正在运行的应用程序从旧引用访问它,则会出现麻烦。如果您先更新引用然后尝试移动对象,则更新的引用是错误的,直到对象被移动为止,并且对象未移动时的任何访问都会导致问题。

对于 CMS 和并行收集器,年轻代收集算法是相似的,并且它是停止世界,即在收集发生时应用程序停止 JVM 正在做的事情是,标记从根集可访问的所有对象,将对象从 Eden 移动到幸存者空间,并将在超出保留阈值的集合中幸存下来的对象移动到老年代。当然,JVM 必须更新所有已移动对象的引用。

对于老一代并行收集器来说,所有标记、压缩和引用更新都在一个停止世界 (STW) 阶段进行,这会导致 GB 堆在几秒钟内暂停。这对于具有严格响应时间要求的应用程序来说是痛苦的。到目前为止,并行收集器仍然是吞吐量或批处理方面最好的收集器(在 Oracle Java 中)。事实上,我们已经看到,对于相同的场景,即使并行收集器花费的时间比 CMS 更多,我们仍然可以获得更高的吞吐量,我认为这与由于压缩而产生的更好的空间局部性有关。

CMS 通过并发标记解决了主收集中高暂停的问题。 STW 有 2 个部分:初始标记(从根集中获取引用)和重新标记暂停(标记结束时短暂的 STW 暂停,以在标记和应用程序同时工作时处理对象图中的更改)。对于几 GB 的堆大小和合理数量的应用程序线程,这两种暂停的范围都是 100 -200 毫秒(请记住,活动线程越多,根就越多)

G1GC 计划取代 CMS 并接受暂停目标。通过增量压缩堆来处理碎片。虽然工作是增量的,所以您可以获得更小的暂停,但这可能会以更频繁的暂停为代价

当应用程序运行时,以上都不能压缩堆(CMS根本不压缩)。 AZUL GPGC 垃圾收集甚至可以在不停止应用程序的情况下进行压缩,并且还可以处理引用更新。因此,如果您想深入了解 GC 的工作原理,那么值得阅读 GPGC 的算法。 AZUL 将其定位为无暂停收集器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 垃圾收集是否总是必须“停止世界”? 的相关文章

  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox

随机推荐