gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:34:22 24 4
gpt4 key购买 nike

这里是 an article引入虚拟调用的jit优化策略。

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

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

最佳答案

我的理解是引擎盖下还有另一个优化,identical code folding .

CustObj::methodCallCustObj2::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 代码实例。

附言

我认为这种优化更像是一种随机的副作用,并不是作者的本意。在他的文章的下一次修订中,要求他对 CustObj2 类中的代码进行更多更改可能是有意义的。

关于java - 为什么优化的虚拟调用指向热点 jit 程序集中的相同地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67224537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com