如何确保java编译器不内联这些方法?

如何确保java编译器不内联这些方法?,java,eclipse,Java,Eclipse,出于测试目的,我需要确保在编译相应的代码以生成.class文件时,某些方法没有内联 在Eclipse中我该怎么做 编辑 对于那些真正需要知道为什么的人,在告诉他们怎么做之前,这里有一个解释——我正在测试一个代码,它检查和操作JVM字节码。这就是为什么我有时希望避免方法内联;您几乎无法控制编译器和JIT如何优化字节码 但我不清楚你为什么要这么做 请注意,各种JVM实现可能允许进行调整,例如,热点中的-XX:MaxInlineSize=可能被设置为一个不可能的低数字,这意味着不会内联任何方法。Ecl

出于测试目的,我需要确保在编译相应的代码以生成.class文件时,某些方法没有内联

在Eclipse中我该怎么做

编辑


对于那些真正需要知道为什么的人,在告诉他们怎么做之前,这里有一个解释——我正在测试一个代码,它检查和操作JVM字节码。这就是为什么我有时希望避免方法内联;您几乎无法控制编译器和JIT如何优化字节码

但我不清楚你为什么要这么做


请注意,各种JVM实现可能允许进行调整,例如,热点中的
-XX:MaxInlineSize=
可能被设置为一个不可能的低数字,这意味着不会内联任何方法。Eclipse编译器中可能有一个等价的选项,但我要小心。

您没有;您几乎无法控制编译器和JIT如何优化字节码

但我不清楚你为什么要这么做


请注意,各种JVM实现可能允许进行调整,例如,热点中的
-XX:MaxInlineSize=
可能被设置为一个不可能的低数字,这意味着不会内联任何方法。Eclipse编译器中可能有一个等价的选项,但我要小心。

当涉及到Java内联函数时,编译器完全可以随心所欲。你在这件事上没有发言权

它使用一些不同的度量来确定是否应该内联某些内容。我相信其中之一就是方法中字节码指令的数量。如果你有这样的方法:

void foo() {
    if(SOME_GLOBAL_BOOLEAN_THATS_ALWAYS_FALSE) {
        // lots of statements here
    }
    // code here
}

如果您在if语句中足够聪明,以确保它不会在您身上进行优化,那么您可能能够减少它在您身上内联的机会。

当涉及Java内联函数时,您完全是在编译器的突发奇想下进行的。你在这件事上没有发言权

它使用一些不同的度量来确定是否应该内联某些内容。我相信其中之一就是方法中字节码指令的数量。如果你有这样的方法:

void foo() {
    if(SOME_GLOBAL_BOOLEAN_THATS_ALWAYS_FALSE) {
        // lots of statements here
    }
    // code here
}


如果您在if语句中足够聪明,以确保它不会在您身上进行优化,您可能能够减少它内联在您身上的机会。

在生成.class文件时,Java方法永远不会内联(只有在运行时通过优化JVM),因此,您无需担心。

在生成.class文件时,Java方法从未内联(仅通过在运行时优化JVM),因此您无需担心。

实际上,现代JIT编译器可能会检测到没有代码将全局设置为true,并实际编译出该代码。如果以后加载任何类来更改该值,java可以(相当聪明地)删除优化。“我开始喜欢Java6了,”库林说;这就是“只要你足够聪明”的部分。实际上,现代JIT编译器可能会检测到没有代码将全局设置为true,并实际编译出该代码。如果以后加载任何类来更改该值,java可以(相当聪明地)删除优化。“我开始喜欢Java6了,”库林说;这就是“只要你足够聪明”的部分。这对测试有什么影响。代码只有在没有功能差异时才会内联。您将看到的唯一区别是性能。对于性能测试,您希望代码的处理与生产完全相同,否则测试毫无价值;它通常推断“我们不知道,但如果你给我们多一点背景知识,我们可能仍然能够提供帮助”。这对测试有何影响。代码只有在没有功能差异时才会内联。您将看到的唯一区别是性能。对于性能测试,您希望代码的处理与生产完全相同,否则测试毫无价值;它通常推断“我们不知道,但是如果你给我们多一点背景知识,我们可能仍然能够提供帮助”。我不是说JIT,它将Java字节码编译成机器码。@mark我实际上知道什么是JIT编译。我的说法仍然成立:你对编译器和JIT如何优化字节码几乎没有控制权,我知道没有可靠的交叉编译器方式来控制初始字节码输出或任何后续优化。你想说Boann提供的答案(我已经标记)是错的吗?@mark我不会说它错了,因为我不知道。证明负数真的很难,我没有时间去尝试。@马克,我还想补充一点,你无法控制在不同的编译器供应商和版本中发出什么字节码。如果不知道您正在执行哪些特定标记和操作,就很难提供更多帮助。我不是说JIT,它将Java字节代码编译成机器代码。@mark我实际上知道JIT编译是什么。我的说法仍然成立:你对编译器和JIT如何优化字节码几乎没有控制权,我知道没有可靠的交叉编译器方式来控制初始字节码输出或任何后续优化。你想说Boann提供的答案(我已经标记)是错的吗?@mark我不会说它错了,因为我不知道。证明负数真的很难,我没有时间去尝试。@马克,我还想补充一点,你无法控制在不同的编译器供应商和版本中发出什么字节码。如果不知道你在做什么特定的标记和操作,很难提供更多帮助。顺便问一下,你有参考资料吗?像Java规范还是什么?@mark:我觉得我最近在JLS或JVM规范的某个地方读到了它,但再次搜索时我找不到它。我有一个模糊的想法,即不仅仅是方法