java不再以class在jvm运行,编译成机器语言后和c的速度可以比吗

启动时全部编译成机器码是可以嘚,JRE给了个启动参数可以让启动时直接编译再运行,听起来很好,但实际试过后就几乎没人用了,因为这样做启动反而更慢.程序的运行是要考虑20/80原則的,大部分代码只会运行一次或很少的几次,而优化的编译是非常慢的,所以对大部分代码编译再运行反而不如直接解释执行快.

当然有人会说為什么不像安卓ART那样把编译结果存起来,下次启动就快了呢,当然可以,现在的JDK提供了一些AOT的支持,不过PC和服务器平台不同于手机. 程序在每次启动時不一定有相同的运行环境,而编译是需要依赖这些的,运行环境有很多因素,如32/64位模式,GC算法,GC参数,编译参数,加载哪些classpath. 甚至经常会遇到需要动态加載class/jar的需求,更不用说需要根据运行情况动态调节的优化了,这些都需要JIT动态地选择编译方式和细节,而预先编译成机器码就相当于锁定了运行环境.

我要回帖

 

随机推荐