2012-04-22 69 views
1

我正在将一些C++代码转换为Java,我想知道我可以对内联函数做些什么。我是否可以假设虚拟机内置函数(必要时),而不用担心这一点?如何进行配置以观察此行为?假设有一个主要的外部函数,并且我为它引发了一个for循环并引发了一百万次调用。我应该期望看到虚拟机内存越来越多地得到改进吗?根据需要,热点VM内联功能是否会启用?

回答

4

是的,Java会内联方法调用。内联由JIT编译器执行,因此您不会通过检查字节码文件来查看它。

对于给定的方法调用是否实际发生内联取决于方法体的大小以及调用是否可以内联。 (如果一个方法调用涉及调度...在JVM有一堆旨在消除不必要的调度的全局优化之后......则不能内联)。

这同样适用于您的外部主函数的示例。这取决于方法体的大小。另一方面,如果该方法需要大量时间来执行,则优化的相对重要性相应地降低。


我的建议是在这个阶段不要担心这样的事情。只需清楚简单地编写代码,并让JIT编译器处理优化问题。当您的应用程序正在运行时,您可以对其进行配置并查看代码中是否有任何值得手动优化的“热点”。


但我应该能够看到这个东西像Visual VM吧?我的意思是最初没有内联,然后越来越多的东西被内联,所以外部方法的平均时间略有减少。

它可能是可观察的,也可能不是,这取决于调用相对于执行方法体所花费的时间。 (剖析通常依赖于对程序计数器进行采样,如果给定代码区域的样本数量太小以及出于其他原因,报告的时间可能不准确。)

它也取决于您的JVM正在使用。并非所有的JVM都会重新优化他们之前优化过的代码。

最后,有一种方法可以让JVM转储由JIT编译器输出的本地代码。如果您准备阅读机器说明,这将给您一个确定内容的明确答案。

+0

但我应该能够看到这个像Visual VM的东西吧?我的意思是最初没有内联,然后越来越多的东西被内联,所以外部方法的平均时间略有减少。 – Nikhil 2012-04-22 05:47:50

相关问题