Java JIT循环展开策略?

Java JIT循环展开策略?,java,optimization,compiler-construction,jit,loop-unrolling,Java,Optimization,Compiler Construction,Jit,Loop Unrolling,JIT的循环展开策略是什么?或者,如果没有简单的答案,那么是否有某种方法可以检查循环中何时何地执行循环展开 GNode child = null; for(int i=0;i<8;i++){ child = octree.getNeighbor(nn, i, MethodFlag.NONE); if(child==null) break; RecurseForce(leaf, child, dsq, epssq); } GNode-child=null; 对

JIT的循环展开策略是什么?或者,如果没有简单的答案,那么是否有某种方法可以检查循环中何时何地执行循环展开

GNode child = null;
for(int i=0;i<8;i++){
   child = octree.getNeighbor(nn, i, MethodFlag.NONE);
   if(child==null)
      break;
   RecurseForce(leaf, child, dsq, epssq);
}
GNode-child=null;
对于(int i=0;i,如果JVM展开循环,那么最好的答案可能是“实际”。请注意,这要求您的代码实际作为热点执行(即JVM认为它值得进行昂贵的优化)


为什么JVM决定这样或那样是一个更难的问题,可能需要对JIT代码进行深入分析。

查看循环中是否正在执行循环展开的另一种方法是在运行代码时指定
-XX:LoopUnrollLimit=1

如果您有一个可执行jar,那么您可以使用以下示例:

java -XX:LoopUnrollLimit=1 -jar your-jar.jar
这面旗子会

展开循环体,服务器编译器中间表示节点计数小于此值


这将直接解决您的问题,而无需查看生成的程序集

这是一个非常非常具体的问题,您需要在特定平台上针对特定JVM的特定版本进行分析。我猜他们“为什么”只有深入分析JIT代码才能回答这个问题。您遗漏了一个关键细节:您使用的是哪个JVM?@aioobe它的Java Hotspot 64位1.6.xThanks。打印程序集是一种可能的方法,但我想知道是否有公开的API来研究这个问题。类似于每当循环展开时调用的方法一个是JIT,我可以计算它被调用的次数以及调用它的上下文。我查看了JVMTI,没有发现任何东西。我非常确定没有这样的API,因为它高度依赖于实现,并且对大多数应用程序的使用有限。谢谢。我想我也希望我的应用程序能够使用它在使用JVMTI和EclipseJDT之后,uch。实际上,整个过程不仅是实现和特定于代码的,甚至可以通过命令行选项来影响它。看看
-XX:LoopUnrollLimit=