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

为什么优化的虚拟调用指向热点jit程序集中的相同地址?

丌官晔
2023-03-14

这里有一篇文章介绍了虚拟调用的jit优化策略。

但令我惊讶的是,所有优化的虚拟调用都使用相同的地址,如本文中的callq 0x000000011418ea00。

所以我很好奇它在那个地址中实际做了什么,以及它如何知道要调用哪个函数,因为所有优化的虚拟调用都指向同一个地址。

共有1个答案

蒋嘉实
2023-03-14

我的理解是,还有另一种优化正在进行,即相同的代码折叠。

CustObj::methodCall和CustObj2::methodCall的代码非常相似,只有打印的字符串不同。因此,JVM编译器能够为它们生成相同的代码:

$ javac tmp.java
$ javap -c -constants 'TestVirtualCall2$CustObj.class'
Compiled from "tmp.java"
class TestVirtualCall2$CustObj {
  public void methodCall();
    Code:
       0: invokestatic  #2                  // Method java/lang/System.currentTimeMillis:()J
       3: lconst_0
       4: lcmp
       5: ifne          16
       8: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: ldc           #4                  // String CustObj is very good!
      13: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: return
}
$ javap -c -constants 'TestVirtualCall2$CustObj2.class'
Compiled from "tmp.java"
class TestVirtualCall2$CustObj2 extends TestVirtualCall2$CustObj {
  public final void methodCall();
    Code:
       0: invokestatic  #2                  // Method java/lang/System.currentTimeMillis:()J
       3: lconst_0
       4: lcmp
       5: ifne          16
       8: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: ldc           #4                  // String CustObj2 is very good!
      13: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: return
}

请注意,即使是字符串加载命令ldc#4也恰好是相同的,因为编译器将字符串放入各自类常量池中的相同位置。

所以JIT肯定只会为这两个虚拟方法生成一个x86代码实例。

P. S.

我认为这种优化更多的是一种随机的副作用,而不是作者的意图。在文章的下一个版本中,要求他对CustObj2类中的代码做更多的更改可能是有意义的。

 类似资料:
  • 问题内容: 在有关Hotspot中的JIT的讲座中,我想提供尽可能多的JIT执行的特定优化示例。 我只知道“方法内联”,但是应该更多。为每个示例投票。 问题答案: 好吧,您应该阅读Brian Goetz的文章以获取示例。 简而言之,HotSpot可以并且将: 内联方法 连接同一对象上的相邻块 如果无法从其他线程访问监视器,则消除锁定 消除无效代码(因此大多数微基准都是毫无意义的) 对非变量的直接存

  • 问题内容: 我已经在某些计算机科学测试中看到了下一段,希望我能在这里对它的含义有一个很好的解释,因为我用它搜索了一个小时,却找不到任何东西。 “当我们说Java语言具有 虚拟方法调用时 ,是指在Java应用程序中,执行的方法由运行时的对象类型决定” 这是什么意思?谁能更好地解释它? 问题答案: 这些行的作者使用的C ++术语。 更好的术语是动态绑定/动态调度。 这意味着,对象的动态类型是“选择”将

  • 本文向大家介绍优化Java虚拟机总结(jvm调优),包括了优化Java虚拟机总结(jvm调优)的使用技巧和注意事项,需要的朋友参考一下 堆设置 -Xmx3550m:设置JVM最大堆内存为3550M。 -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为

  • 我正在使用,,“autoev”来设置我的虚拟环境。 我安装了< code>Python3.5.1、< code>Python2.7.9并创建了几个项目虚拟环境。 但当我激活每个环境并通过 (chacha_dabang)Chois@Chois-MacPro$哪个python /Users/Chois/.pyenv/shims/python < br > (chacha_dabang)Chois@Ch

  • 我想用javascript(网络技术)编程一个桌面应用程序,并寻找电子和Chrome应用程序之间的比较。 我所需要的一切似乎都可以通过Chrome应用程序实现,但围绕Electron/NW有一个很大的宣传。js。电子的优点是什么?这是由于大量的节点包造成的吗? 我认为功能差异对我来说很清楚。 赞成和反对意见如下: 正如爱德华多所指出的,谷歌宣布将停止ChromeOS以外所有平台的Chrome应用。

  • 由于DOM具有结构,我认为在很多情况下,我们知道将要进行的确切更改,在这些情况下,我看不到虚拟DOM的优势。我是不是漏掉了这幅画中一些重要的部分? 我看到了一些关于虚拟DOM主题的其他讨论,但我觉得它没有回答我的问题。我希望举一个例子会使它更具体。