java - 一个好的 Java VM 中方法调用的开销是多少?

标签 java performance jvm

有人可以提供反汇编的机器代码汇编程序列表吗?

我的意思是,与 C 中的普通函数调用相比,肯定有一些开销。

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

我猜某处还存在返回堆栈溢出检查。

编辑:我想我应该提到,我不是一个java程序员,而是一个编译器编写者,并且想找出为什么java应用程序如此缓慢,而java微基准测试与 native 编译代码相当。因此,查看一些细节对我来说很重要,即使它们只需要几十纳秒和一些额外的说明。

最佳答案

Java 不会直接编译为机器代码,它会编译为字节码,然后在运行时解释或编译为机器代码——我不知道如何在运行时获取机器代码,我只是将其想象为如此大量的移位、变化的字节最终会快速可靠地执行。

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

使用 Final 可以提供很大帮助,因为它可以向虚拟机提供有关如何进一步优化的提示。

由于方法调用实际上可以完全编译出来,并且最多具有最小的成本 - 你真的不应该担心它。只要尽力编写代码,并在性能规范失败时担心性能问题(此时,局部优化比尝试消除代码中的方法调用、破坏所有相关人员的代码库要好得多)。

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

关于java - 一个好的 Java VM 中方法调用的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830179/

相关文章:

java - 如何在 JRE 上禁用 IPv6 堆栈用于 IPv4 IP?

java - 从 JVM 检索 jar 文件?

java - 线程执行服务

java - SoapUI MockServices 返回 html 而不是 xml 响应

java - 如何计算处理3中两个给定日期之间的天数?

c# - 奇怪的性能行为

java - "java -server"和 "java -client"之间的真正区别?

java - 如何提高JavaFX图形绘制的性能?

performance - F#中的返回字符串和代码优化

java - 如何修复: Unknown constant tag 32 in class file com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator