优秀Java VM中方法调用的开销是多少?

Lot*_*har 2 java performance jvm

有人能想出一个反汇编的机器码汇编列表吗?

我的意思是与C中的普通函数调用相比,必须有一些开销.

VM需要跟踪调用以查找热点,并且当它使用已编译的代码时,如果新加载的类需要重新编译,则需要提供更改已编译方法的方法.

我想在某处还有一个返回堆栈溢出检查.

编辑:我想我应该提一下,我不是一个java程序员,而是一个编译器编写器,想要找出为什么java应用程序如此慢,而java微基准测试与本机编译代码相当.因此,在这里查看一些细节对我来说很重要,即使它们只需要几个几纳秒和一些额外的指令.

Bil*_*l K 6

Java不直接编译为机器代码,它编译为字节码,然后在运行时解释或编译为机器代码 - 我不知道如何在运行时获取机器代码,我只是想象它作为这个巨大的质量移位,改变字节,最终快速可靠地执行DAMN.

一个小方法调用应该在运行时完全编译.如果可以解析或忽略足够的引用,即使是大型方法调用也可以由VM编写为内联机器代码.

使用Final可以提供很多帮助,因为它可以为VM提供关于如何进一步优化的提示.

因为方法调用实际上可以完全编译出来,并且最多只需要最小的成本 - 你真的不应该担心它.当你有一个失败的性能规范时,只需编写最好的代码并担心性能问题(在这一点上,点优化比尝试消除代码中的方法调用要好得多,破坏了所涉及的每个人的代码库).

请注意,由于运行时分析,它在某些非常罕见的情况下实际上比C中的类似代码更快(c编译器不会在运行时进行分析并为您手动优化代码,您必须自己完成所有这些) .

  • @Lothar:您不能将您对Java VM的看法建立在1.3 VM的性能上,即*9年前*.现代JVM的速度非常快,并且在性能方面完全无法识别旧的1.3内容. (2认同)