性能问答>private函数调用,jdk8和jdk13生成的指令不同。>
1回复
2年前

private函数调用,jdk8和jdk13生成的指令不同。



这段简单的代码:

public class Test {
    
    private void testPrivate() {}
    public void testPublic() {}
    
    public static void main(String[] args) {
        Test t = new Test();
        t.testPrivate();
        t.testPublic();
    }
}

java8生成字节码

 0 new #2 <Test>
 3 dup
 4 invokespecial #3 <Test.<init>>
 7 astore_1
 8 aload_1
 9 invokespecial #4 <Test.testPrivate>
12 aload_1
13 invokevirtual #5 <Test.testPublic>
16 return

java13生成字节码

 0 new #7 <Test>
 3 dup
 4 invokespecial #9 <Test.<init>>
 7 astore_1
 8 aload_1
 9 invokevirtual #10 <Test.testPrivate>
12 aload_1
13 invokevirtual #13 <Test.testPublic>
16 return

可以看到对private函数调用,java8生成了 invokespecial, 而java13生成了invokevirtual,为什么会这样?

3356 阅读
请先登录,再评论

这个其实不是JDK13才有的,JDK11里提供的一个变化
可以加一个javac的参数你会看到不一样的效果,比如javac -XDdisableVirtualizedPrivateInvoke XXXXX.java
可以看看这个描述 https://bugs.openjdk.java.net/browse/JDK-8046171

12年前