我已经使用过-xx:+printcompilization
,我知道JIT-compiler的基本技术以及为什么要使用JIT-compilization。
然而,我仍然没有发现JVM是如何决定JIT编译一个方法的,即“当合适的时间来JIT编译一个方法时”。
我假设每个方法都开始被解释,只要它不被归类为“热方法”,它就不会被编译,这是对的吗?我在后脑勺上读到,当一个方法被执行至少10.000次(在解释该方法10.000次后,它将被编译)时,它被认为是“热的”,但我必须承认,我不确定这一点,也不确定我在哪里读到了这一点。
所以总结一下我的问题:
(1)是否只要每个方法没有被归类为“热”方法(因此已经被编译),就会被解释,或者即使方法不是“热”,也有理由被编译?
(2)JVM如何将方法分类为“非热”和“热”方法?处决次数?还要别的什么吗?
(3)如果“hot”方法有特定的阈值(比如执行次数),那么是否有Java标志(-xx:...
)来设置这个阈值?
热点编译策略相当复杂,尤其是对于分层编译,在Java8中默认启用分层编译。它既不是执行次数,也不是compilethreshold
参数的问题。
最好的解释(显然是唯一合理的解释)可以在热点源中找到,请参见AdvancedThresholdPolicy.hpp。
我将总结一下这个高级编译策略的要点:
i
;b
。向后分支通常表示代码中的循环。每当计数器达到某个频率值(TierXinvokeNotifyFreqLog
、TierXBackedGenotifyFreqLog
)时,就会调用编译策略来决定当前运行的方法下一步要做什么。根据i
、b
的值以及C1和C2编译器线程的当前负载,可以决定
这里的关键参数是TierXInvocationThreshold
和TierXBackedgeThreshold
。根据编译队列的长度,可以为给定的方法动态调整阈值。
编译队列不是FIFO,而是一个优先级队列。
带有配置文件数据的C1编译代码(第3层)的行为类似,只是切换到下一层(C2,第4层)的阈值要大得多。例如。一个解释的方法可以在第3层编译大约200次调用,而C1编译的方法在第4层重新编译5000+次调用。
问题内容: 我已经使用,并且我知道JIT编译器的基本技术以及为什么使用JIT编译。 但是我仍然没有找到JVM如何决定JIT编译方法的方法,即“何时到了JIT编译方法的正确时间”。 我假设每个方法都开始被解释,并且只要它不被归类为“热方法”,就不会被编译,这是对的吗?我脑海里有些东西我读到,当一个方法执行至少10.000次(解释该方法10.000次后,将被编译)时,该方法被视为“热”,但我必须承认不
我已经使用过,并且我知道JIT-编译器的基本技术以及为什么使用JIT-编译。 然而,我仍然没有发现JVM是如何决定JIT编译一个方法的,即“当正确的时间到来时JIT编译一个方法”。 (2)JVM如何将方法分为“非热”和“热”方法?执行次数?还要别的什么吗? (3)如果“hot”方法有特定的阈值(如执行次数),是否有Java标志()来设置此阈值?
我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于
问题内容: 我的Java应用程序出现问题,JIT破坏了代码。如果禁用JIT,一切正常,但运行速度慢10-20倍。 有什么方法可以禁用特定方法或类的JIT吗? 编辑:我正在使用Ubuntu 10.10,得到相同的结果都与: 和: 问题答案: 以下选项适用于我的JVM,以排除特定方法:
问题内容: 我正在尝试为我的简单类生成hashCode()方法,但是我什么也没用。我将不胜感激任何帮助。我已经实现了equals()方法,该方法如下所示,并且还想知道是否需要实现compareTo()方法。我已经导入了java.lang.Character以使用character.hashCode(),但它似乎不起作用。 提前致谢… 正在给我java.lang.Comparable转换错误的com
问题内容: 有什么方法可以查看JIT在JVM中生成的本机代码吗? 问题答案: 假设你使用的是Sun Hotspot JVM(即Oracle 在java.com上提供的JVM ),则可以添加该标志 在运行代码时。这将打印出由JIT编译器生成的优化代码,而将其余部分省去。 如果要查看整个字节码,包括未优化的部分,请添加