现代Java如何优化自我分配?

时间:2014-04-22 20:50:33

标签: java memory optimization jvm

我在循环中反复使用以下代码行:

Object val;
while (logic())
   val = val == null ? generateObj() : val;

我很好奇JVM如何优化这段代码,如果有的话?也就是说,如果val != null将JVM意识到赋值返回自己并且只是忽略该行的其余部分,或者是否需要花时间将val的引用复制回自身?

我在Windows 7环境中运行标准JRE 6和JRE 7.

ASIDE: 如果JVM没有很好地优化此操作,那么执行此调用的最佳替代方法是什么?只需if (val == null) val = generateObj();

2 个答案:

答案 0 :(得分:1)

Java是一种解释型语言。 Java主要在运行时进行优化。生成的字节码通常完全未经优化。只有当JVM执行字节码时,它才会开始优化,具体取决于代码的执行方式。因此,如果您的循环只运行了几次,那么JVM可能不会优化任何内容。你永远无法确定JVM是否会优化某些东西。它还取决于具体的JVM实现。所以你永远不要依赖它。

答案 1 :(得分:1)

好奇?选择一些JVM(它们的列表在这里可用:http://en.wikipedia.org/wiki/Java_Virtual_Machine),源代码打开并转到JIT编译器的调试输出。

我不知道特别是Oracle JVM的内部(你可能在Windows上运行的那个)是开源的,但也许他们的工程师可能会清楚地回答你的问题,特别是如果你提出性能问题ticket(我曾经解决过这种Symbian JVM的门票(其中有2个),我们有工具来详细诊断这类东西。)

一般来说,现代Java如何优化某些东西的问题没有一般简单的答案。恕我直言了解更多信息的最佳方法是选择一个并使用它(运行基准测试,研究痕迹等)。

如果你问如何编写更好的代码,那么这个 - super cool Stack Overflow answer - 可以给你一些提示

编辑:是否有设置JDK从C编译器编译Java代码的指南? (理想情况下是日食设置)

是的,应该有一个。请注意,使用较大的软件存储库(数千个文件和数十万到数百万行代码)通常不适合胆小的人,并且正确设置环境(即使有一些文档)可能需要几天时间

Wikipedia - List of Java virtual machines列出了一些开源JVM。 Oracle JVM页面指向OpenJDK - the The HotSpot Group,您可以在其中找到一些(大量)资源和指南,但主要是与能够帮助您启动和运行的开发人员建立的宝贵联系。

(我无法为您提供更准确的说明,因为我已经离开JVM和Symbian OS业务近5年了,事情发生了一些变化......)