Shenandoah 垃圾收集器负载参考屏障

2024-03-16

对于目睹过发展的人来说这不是什么大秘密Shenandoah一个主要的批评是它采用了GC barriers for 每一个写入和读取:无论是引用还是原始。

Shenandoah 2.0声称这不再是问题,可以通过所谓的解决方案负载参考屏障。这是怎么发生的?


我假设读者知道什么是障碍以及为什么需要它。非常简短的介绍这是我关于该主题的另一个答案 https://stackoverflow.com/questions/59044616/whats-the-mark-compact-algorithm-used-by-hotspot/59141137#59141137.

为了正确理解这一点,我们需要首先看看最初的问题到底出在哪里。让我们举一个相当简单的例子:

static class User {
     private int zip;
     private int age;
}

static class Holder {
    
     private User user;
     // other fields we don't care about
      
}

现在让我们想象一下这样的理论方法:

public void access(Holder holder){
     User user = holder.user;
     for(;;){ // some loop here
         int zip = user.zip;
         System.out.println(zip);

         user.age = // some value taken from the loop for example
     }
}

这个想法不是为了展示correct示例,但是一个示例:

  • a read (user.zip;)

  • a write (user.age = ...)

现在因为Shenandoah 1.0需要引入壁垒到处,这段代码看起来如下:

public void access(Holder holder){
  User user = RB(holder).user;  
  for(;;){ // some loop here
      int zip = RB(user).zip;
      System.out.println(zip);

      WB(user).age = // some value taken from the loop for example
  }
}   

注意RB(holder).user (RB代表read barrier) and WB(user).age (WB代表write barrier)。现在想象一下循环是hot- 你将为如此多的障碍付出代价。即使在循环执行期间没有 GC 活动,障碍也是如此still到位并且必须有代码有条件的检查是否需要执行屏障。

长话短说:无论如何,这些障碍都不是免费的。

需要这些屏障来保持堆一致性,因为有two内存中对象的副本疏散阶段,你需要始终保持一致的读写。始终如一这里的意思是在Shenandoah 1.0 a read可能是从“到空间”或“从空间”(称为“弱到空间不变量”)发生的,而write可能发生于to-space only.


Shenandoah 2.0说它将确保所谓的“空间不变量”(与之前的相反)weak一)。基本上 - 它表示所有写入和读取都将发生在“to-space”中/“to-space”中。在疏散过程中,对象有两份副本:一份位于旧区域(称为“from-space”),一份位于新区域(称为“to-space”)。

它通过一个相当简单但绝妙的想法实现了这种“空间”不变量。而不是使用障碍writes发生这种情况时,它确保最初加载的对象肯定是从“to-space”加载的。这是通过以下方式完成的负载参考屏障。通过重构前面的示例来理解这一点要简单得多:

  public void access(Holder holder){
      User user = LRB(holder).user;  
      for(;;){ // some loop here
          int zip = user.zip;
          System.out.println(zip);

          user.age = // some value taken from the loop for example
      }
  }

我们已经推出了LRB障碍并移除了另外两个。因此,加载对象时会发生加载引用屏障,他们称之为:在定义站点,而不是在读取或存储时,他们称之为在他们的使用现场。你可以把它想象成这些障碍被插入到哪里aload and getField(供参考)使用。

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

Shenandoah 垃圾收集器负载参考屏障 的相关文章

  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 每个进程 System.Web.HttpApplication 初始化多少次

    我有global asax它从我创建的自定义类扩展而来 称为MvcApplication它延伸自System Web HttpApplication 在它的构造函数中 它记录应用程序的启动 如下所示 protected MvcApplica
  • 如何将选项传递给 Rust 的 serde,以便可以在 Deserialize::deserialize() 中访问?

    对于上下文 我正在用 Rust 编写光线追踪器 但我正在努力寻找一种以与文件系统无关的方式加载场景的好方法 我在用着serde https serde rs 这样我就不必发明自己的文件格式 还 资源 图像纹理和网格数据 单独存储到场景文件中
  • SignalR 和 require.js 配置

    我正在合并SignalR进入我已经使用的项目需要 js处理我的脚本依赖项 我在确保 jquery signalR 1 1 2 加载后调用 signalr hubs 时遇到了一些麻烦 我已经让它工作了 但我想知道是否有更好的选择 这就是我所拥
  • 如何同步包含克隆元素的 jquery 可排序列表?

    我的情况很特殊 我有两个清单 1 列表包含所有项目 2 包含顶部列表 显然 项目重叠 并且第二个列表中的项目根据它们从列表 1 中克隆的元素标记为类clone 23clone 25 Example List 1 1 run 2 eat 3
  • WPF 图像缩放

    我有一个视图框 里面有一个图像 这非常棒 因为 Viewbox 会缩放图像以适合窗口 但是 我需要能够将图像缩放到完整尺寸并显示滚动条 但我很难弄清楚如何做到这一点 这就是我现在所拥有的 谁能指导我如何修改它以实现上述功能
  • R-lang / 如何使用 R 进行正则表达式 (Perl) 提取

    我使用 javascript 的正则表达式测试器得出以下 3 个正则表达式案例 从文本中提取不同类型的 URL 我想在 R 中使用这些正则表达式 regxi 来满足以下条件 http 网址 https www s 比特利网址 https b
  • 如何显示rails本地项目文件夹中的图像?

    非常基本的问题 但不知何故我无法让它发挥作用 我试图让位于项目本地文件夹中的图像显示在 Rails 上 另外 我正在使用引导程序 因此我需要声明class img responsive 以及 这是原始代码 img class img res
  • 如何将 read_html 的输出保存和读取为 RDS 文件?

    对象可以像这样保存和读取 Save as file saveRDS iris mydata RDS Read back in readRDS mydata RDS 但这似乎不适用于用xml2 read html Example librar
  • 一个JVM下的多个进程

    我们可以在一个 JVM 中运行多个进程吗 每个进程都应该有自己的内存配额吗 我的目标是在新的 http 请求进入时启动新进程 并为该进程分配单独的内存 以便每个用户请求都有自己的内存配额 如果内存配额已满 则不会打扰其他用户请求 我怎样才能
  • android: Parse.com Parseobject classnotfound 错误

    我在 Android 应用程序中使用 Parse com 的库 但收到以下错误 05 26 18 43 31 838 E AndroidRuntime 4759 致命异常 主要 05 26 18 43 31 838 E AndroidRun
  • 反应多个过滤器下拉菜单

    我有 React 应用程序 您可以在其中根据几个不同的属性过滤列表 目前 我可以一次过滤每个类别 但我想一次过滤多个类别 因此当您选择更多过滤器时 列表会变得越来越小 然后 当您清除所有值时 它将返回到原始列表 我怎样才能实现这个目标 de
  • 解析/转换 cookie 为 JSON 格式

    我们有任何 javascript 库或正则表达式来解析 将 cookie 转换为 JSON 格式吗 有些cookie是这样的 cookie referer example com post id 22 bcomID 8075 subretu
  • 替换非渲染(非显示)元素文本中的 ↵ (\n)

    我正在编写一个解析器 从隐藏的 iframe 中获取数据 在文本中我需要替换 n 个字符 空间 我用它来完成这项任务 text replace n gi 但是 它仅适用于可见元素 即没有display none 如果该元素不可见 displ
  • PHP json_decode 返回 null

    我正在努力让它发挥作用 但看不出我哪里出了问题 有人可以帮忙吗 Hint 初始 JSON 存储在 json变量 不验证 Code FIXED
  • 使用 github 操作从 docker build 内的 git repo 安装 PIp

    我正在致力于将通用模块分离到我们 github 组织的专用存储库中 使用 git repo 中的 pip installDockerfile安装组织内部开发的共享模块 RUN pip3 install r requirements txt
  • 无法从 Twilio Studio 创建任务

    在 Twilio Studio 上 我可以收到短信 回复预设回复 但当我尝试在 Flex 中传递 创建任务时 出现错误 REST API 流触发器不支持 SendToFlexWidget 即使我使用的是收入消息触发器 即使使用默认消息流 我
  • 将光标从块或矩形更改为线? [复制]

    这个问题在这里已经有答案了 我的光标是一个闪烁的黑色矩形 我不知道怎么变成这样了 我想把它变回一条闪烁的垂直线 图片 您正处于替换模式 按Insert键盘上的 键切换回插入模式 许多处理文本的应用程序都有这个共同点
  • Android NDK 反编译本机代码的可能性

    是否可以通过 ndk 解码编译并喜欢到 android 的本机代码 是否可以从 apk 重建项目并将其导入 eclipse 或任何其他 IDE 是否可以使用 so如果 java 本机函数声明正确完成 则再次在 apk 文件中重新构建文件以重
  • 有没有办法将 sys.fn_varbintohexstr 结果转回 varbinary?

    有没有function in SQL Server要做到这一点 扭转sys fn varbintohexstr 您需要在动态 SQL 语句中使用十六进制字符串 以便将其解析为 varbinary 下面是如何做到这一点的一个示例 Our or
  • Shenandoah 垃圾收集器负载参考屏障

    对于目睹过发展的人来说这不是什么大秘密Shenandoah一个主要的批评是它采用了GC barriers for 每一个写入和读取 无论是引用还是原始 Shenandoah 2 0声称这不再是问题 可以通过所谓的解决方案负载参考屏障 这是怎