Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道方法是JIT还是解释的_Java_Jvm - Fatal编程技术网

Java 如何知道方法是JIT还是解释的

Java 如何知道方法是JIT还是解释的,java,jvm,Java,Jvm,据我所知,并没有明确的规则来确定Java方法在调用时是JIT还是解释。 所以,有没有什么办法告诉JVM我需要一个特定的方法来进行JIT呢。有没有一种方法可以确定哪种方法是JIT的,哪种方法不是JIT的 因此,有没有办法告诉JVM我需要某种方法来进行JIT。 不,哪些方法是“JIT”的,哪些方法不是由您决定的,事实上,不能保证任何方法都会被JIT。我建议您将这些决定留给JVM来做。据我所知,您不知道(从JVM内部)并且不能强制执行JIT的方法,但是使用-XX:+printcomilationJVM

据我所知,并没有明确的规则来确定Java方法在调用时是JIT还是解释。 所以,有没有什么办法告诉JVM我需要一个特定的方法来进行JIT呢。有没有一种方法可以确定哪种方法是JIT的,哪种方法不是JIT的

因此,有没有办法告诉JVM我需要某种方法来进行JIT。


不,哪些方法是“JIT”的,哪些方法不是由您决定的,事实上,不能保证任何方法都会被JIT。我建议您将这些决定留给JVM来做。

据我所知,您不知道(从JVM内部)并且不能强制执行JIT的方法,但是使用
-XX:+printcomilation
JVM参数,您可以观察JIT编译器的工作,并检查某个方法是否在程序的特定运行中被JIT

有没有办法确定呢 哪种方法将被JIT,哪种方法将被JIT 不是

(Oracle)Sun JVM被称为HotSpot,这意味着它会查看哪些方法被调用最多,从而变得“热门”,而这些方法是第一个被编译的方法。所以有些方法可能永远不会被编译。但是如果你知道这个方法被多次调用,那么它很可能被编译。您可以用VM选项设置阈值,该选项指定考虑“热”方法需要多少调用。
我不知道如何检查当前代码是以解释模式还是编译模式运行。VM崩溃日志显示堆栈跟踪中的哪些方法被解释或编译,也许有某种方法可以在运行时获取它。

有一种方法可以要求jvm编译一个类,它不保证做任何事情,但应该在任何具有jit的jvm上工作

Compiler.compileClass(MyClass.class);

你说不出来,除非热点中有bug,否则它不会有任何区别。术语“JIT”至少已经过时十年了。

+1:“JIT”在语义上没有区别,只是性能的一个实现细节。运行时当然会尝试以尽可能快的方式执行所有代码——一个认为自己比Hotspot更清楚Hotspot应该对类做什么的开发人员正在欺骗自己。完全同意。非常好的评论+1好的。嗯。在开发库(例如!)时,了解方法是否内联、JIT等是非常重要的。了解JVM的工作原理对于编写性能友好的代码至关重要。不能内联一个方法,而是通过一个虚拟表进行调度(这意味着没有循环展开,没有跳过边界检查等),这可能意味着速度降低10倍……是的。但关键是,由于所有层次的复杂性,99.9%的情况下,方法是否应该JIT、内联等最好由JVM决定(JVM对这样做的效果有更深入的了解)。实际上,开发人员可以(应该能够)拥有相同级别的“洞察”,内联对于非常紧密的循环非常重要(代码的复杂性不会影响最内部的循环)。JVM在更大的方法中内联严重变形的接口时有问题(例如)。破坏内联缓存(当直接内联没有发生时)这也很糟糕。仅仅依靠JVM来产生最佳结果并不总是最好的情况,我从不建议任何新手尝试优化代码,使其内联友好,但这对于基于java的语言或框架开发人员来说非常重要。编译为本机代码的方法可以不编译。系统是动态的namic和更改可能会导致已编译代码被删除。java可能也不会JIT整个方法。我很好奇您为什么想知道。