JIT可以做这个字段访问优化吗?

2024-01-04

免责声明:请不要就过早优化提出建议。我只是好奇。

想象一下,我想确保字段引用的某些对象可以尽快被垃圾收集。我正在使用像这样的自制单链表

class BigData {
    byte[] someBigArray;
    BigData next;
}

private BigData bigData;

并像这样迭代

while (bigData != null) {
    process(bigData);
    bigData = bigData.next;
}

JIT 是否可以随意更改它,如下所示?

BigData tmp = bigData;
while (tmp != null) {
    process(tmp);
    tmp = tmp.next;
}
bigData = null;

假设没有其他对任何实例的引用BigData。认为process是一个不访问该字段的简单内联方法bigData。两个片段是等效的(假设中间没有抛出异常),唯一的区别是第二个片段将字段访问从循环移到了外部。

重复免责声明:请不要就过早优化提出建议。我只是好奇。


回复评论“即使 JIT 所做的就是你‘想要’的改变,为什么这会让 GC 更快/更快地收集它们呢?”:如果JIT做了改变,那么所有的大对象只能在循环之后被收集。如果没有,则每次循环前进时,都会有一个对象符合 GC 的条件。

附录:

实际上,只要 JIT 可以自由地执行上述转换,它就可以执行以下转换:

BigData tmp = bigData;
bigData = null;
while (tmp != null) {
    process(tmp);
    tmp = tmp.next;
}

我在这里看不到任何缺点,它使所有对象在原始代码中都可以收集。


嗯,优化器can优化

while (bigData != null) {
    process(bigData);
    bigData = bigData.next;
}

into

BigData tmp = bigData;
while (tmp != null) {
    process(tmp);
    tmp = tmp.next;
}
bigData = null;

if the bigData字段不是volatileprocess方法没有禁止这种优化的副作用。

但在实践中,代码转换(如果有的话)看起来会完全不同。通常,优化器会展开循环,创建一个执行一定次数迭代的代码块,并在向后跳转之前执行字段存储操作。因此,存在垃圾收集器可以跳入的某些“保存点”。但是如果process方法包含访问的代码bigData字段或可能分配内存等,字段存储将在每次调用之前执行。

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

JIT可以做这个字段访问优化吗? 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 如何证明 .NET CLR JIT 每次运行只编译每个方法一次?

    There s 一个老问题 https stackoverflow com questions 1255803 does the net clr jit compile every method every time 1255832每次询问
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • 允许 numpy 类型溢出

    我试图在 Python 中获得 C 类型语言的 正常 溢出 下溢行为 令我惊讶的是 一个RuntimeWarning当我试图获得这种行为时会引发 例子 np uint8 255 np uint8 1 gt gt gt RuntimeWarn
  • ASP.NET 的垃圾邮件过滤器?

    我正在寻找一个可以集成到我的 ASP NET 应用程序中的垃圾邮件过滤器 我不需要任何委托服务 例如 Akismet 因为我正在为高流量网站执行此操作 有什么建议吗 编辑 我的意思是垃圾邮件过滤器 它是一个基于论坛的网站 编辑 感谢您的回答
  • Chrome 更新后 Android 9 WebView(还有 admob 广告)无法加载

    我们有一个严重依赖网络视图的应用程序 上周之后我们注意到 如果 Android 9 用户花费大约 10 到 30 时间加载 Web 视图 那么 Web 视图只会显示空白页面 并且加载进度会达到 10 Admob 原生广告也停止展示 唯一改变
  • 是否可以通过数据 URL 在 Android 上共享图像?

    是否可以使用这样的代码共享图像 Intent share new Intent Intent ACTION SEND share setData Uri parse data image png base64 iVBORw0KGgoAAAA
  • 如何在 JSF 页面中执行 Java Swing 代码

    大家好 我是 JSF 的新手 我已经创建了一个 java 文件 当用户按下 XHTML 页面上的按钮时我需要运行该文件 我该怎么做 对于像我这样的初学者来说 还有什么好的 JSF 教程吗 谢谢 JAVA代码是一段简单的代码 允许用户选择一个
  • 如何在 Laravel 5.4 中设置 cookie?

    我在 laravel 5 4 中有这个功能 但我无法从 cookie 中获取任何内容 Cookie queue currentLang heb 999999999 echo request gt cookie currentLang 但我得
  • 如何将rpm包安装到非默认路径? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个 rpm 包 我需要从中提取一些文件 该软件包不可重定位 我尝试过 rpm root prefix 但不起作用 我应该采取什么方法进行提取 预
  • 搜索结果和后退按钮/HTML 表单

    我正在寻找应用程序中基于表单的搜索结果反复出现的问题的解决方案 基本上 当用户使用 HTML 表单进行搜索并且我在下一页上显示数据库的结果时 效果非常好 但是 当用户单击结果集中的单个记录 然后单击浏览器上的 返回 时 浏览器会询问 Fir
  • 如何使用 Jekyll 向 MarkDown 添加多个类?

    我想在 Jekyll 驱动的网站中生成 HTML 表 该表的格式应为table and table stripped像这样的类 table class table table stripped 我该怎么做 类似问题 如何在 Jekyll 中
  • 如何在 React 中使用 FileReader?

    我试图让用户 选择文本文件 并将其显示在用户界面中 稍后 我将使用 txt 文件中的数据进行绘图 但是 我无法显示txt文件的内容 有几个可用的模块 但我不知道如何使其在 React 中工作 以下是我找到的例子 https stackove
  • 如何计算 jQuery 中函数花费的时间?

    我有 jQuery 函数 例如 A B 和 C 每个函数都会对不同的站点进行一些 Ajax 调用 我想计算运行每个函数需要多少时间 我猜以毫秒为单位 我只想在长循环和不同的现代浏览器 Safari Chrome IE10 Mozilla 中
  • 将html包含在另一个html文件中[重复]

    这个问题在这里已经有答案了 我有一个 html head 模板和一个导航模板 我想将它们包含在我网站的所有其他 html 文件中 我找到了这个帖子 在 HTML 文件中包含另一个 HTML 文件 https stackoverflow co
  • 有什么方法可以使用 matplotlib.pyplot 创建直方图而不绘制直方图?

    我正在使用 matplotlib pyplot 创建直方图 我实际上对这些直方图的图不感兴趣 但对频率和箱感兴趣 我知道我可以编写自己的代码来执行此操作 但更喜欢使用这个包 我知道我可以做到以下几点 import numpy as np i
  • 错误“与服务器的连接失败。”在 Cordova 和 jQuery 中

    我使用 Cordova 和 JQuery mobile 创建了一个 Android 应用程序 当我使用 google chrome 测试运行代码时它效果很好 但是当我尝试使用 android studio 在 android 模拟器上运行它
  • boost.spirit qi 中序列和列表运算符的属性?

    我想解析类似的东西 xxxx xxxx 被 eol 分成vector
  • 树数据结构中的节点总数?

    我有一个树数据结构 每个节点都有 L 层深度aboutN 个节点 我想计算出树中节点的总数 为此 我认为 我需要知道有子节点的节点的百分比 N 中叶节点与非叶节点之比的正确术语是什么 三者中节点总数的计算公式是什么 Update有人提到分支
  • Gallery 类型已被弃用

    imageView setLayoutParams new Gallery LayoutParams WindowManager LayoutParams MATCH PARENT WindowManager LayoutParams MA
  • 拦截器中的角度http请求时间

    我正在制作一个拦截器来记录我的 http 请求 到目前为止 一切都很好 一切都按预期进行 我现在想要的是获取执行请求所需的时间 我以为我可以做这样的事情 const start Date now return next handle req
  • 如何将 JAXB 类实例编组为其超类

    是否可以封送 JAXB 带注释的类实例作为它的超类 这也是一个 JAXB 带注释的类 XmlAccessorType XmlAccessType FIELD XmlType name BenamningTYPE propOrder bena
  • JIT可以做这个字段访问优化吗?

    免责声明 请不要就过早优化提出建议 我只是好奇 想象一下 我想确保字段引用的某些对象可以尽快被垃圾收集 我正在使用像这样的自制单链表 class BigData byte someBigArray BigData next private