java中方法不要写太长的真正原因-DontCompileHugeMethods

来源:互联网 发布:数据分析与处理 编辑:程序博客网 时间:2024/06/05 00:22

   java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗?

 

        我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码执行,执行速度会大大加快,这就是所谓的JIT编译。

        hotsopt源码中有一句

if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false;  

 当DontCompileHugeMethods=true且代码长度大于HugeMethodLimit时,方法不会被编译。

        DontCompileHugeMethods与HugeMethodLimit的值在globals.hpp中定义:

product(bool, DontCompileHugeMethods, true,        "don't compile methods > HugeMethodLimit")develop(intx, HugeMethodLimit,  8000,        "don't compile methods larger than this if +DontCompileHugeMethods")


         上面两个参数说明了Hotspot对字节码超过8000字节的大方法有JIT编译限制,这就是大方法不会被JIT编译的原因。由于使用的是product mode的JRE,我们只能尝试关闭DontCompileHugeMethods,即增加VM参 数”-XX:-DontCompileHugeMethods”来强迫JVM编译大方法。但是不建议这么做,因为一旦Code Cache满了,HotSpot会停止所有后续的编译任务,虽然已编译的代码不受影响,但是后面的所有方法都会强制停留在纯解释模式。




       
http://enetor.iteye.com/blog/976070

         上面两个参数说明了Hotspot对字节码超过8000字节的大方法有JIT编译限制,这就是大方法不会被JIT编译的原因。由于使用的是product mode的JRE,我们只能尝试关闭DontCompileHugeMethods,即增加VM参 数”-XX:-DontCompileHugeMethods”来强迫JVM编译大方法。但是不建议这么做,因为一旦Code Cache满了,HotSpot会停止所有后续的编译任务,虽然已编译的代码不受影响,但是后面的所有方法都会强制停留在纯解释模式。
原创粉丝点击