从JVM指令到机器指令

我们前面也聊过JVM在规范层面引入字节码的好处,但将Java字节码翻译成机器指令是需要时间的。所以如何提高Java指令到机器指令的转化效率成为每一个JVM实现必须考虑的问题。如果发挥我们的想象力来理解应该有如下方法:


□ 把Java字节码直接再次编译成本地可执行代码,执行的时候就没有JVM的事了。
□ JVM在运行期负责不断地解释了。

把Java字节码直接编译成机器码在有些应用场景中不是不可行,可以借助GCC的GCJ或者其它编译器,但我们会牺牲很多Java的特性。用Java语言风格写出来的程序始终带着Java的风格,如果是特别庞大的Java项目基本是不可行的。换句话来说,在这个地方我们就没有必要充当高手了,还是乖乖地研究一下JVM运行期的JVM指令解析吧。

但上面的两个方法又可以进一步的带出如下思路:

□ JVM可以在启动时一次性把所有的方法中的Java指令全部翻译成本地代码,这样启动的时候慢一点,但运行的时候快一点。
□ JVM一边运行一边翻译了,运行的时候慢了些。

其中第一种方法就是大家经常说的JIT(Just In Time)。但一般一个Java项目不知道有多少方法要翻译,并且有些翻译也许根本用不到;还有如果是一个客户端的应用,让用户启动的等待就很吓人,体验不免有些牵强。

第二种方法是最朴素的了,还用谈?

一般情况下现在的JVM实现都是采用JIT(其实.NET也是),但会做如下的一些优化,可以简单描述为:

□ 每个方法被调用一次就给这个方法计数加1。
□ 那些方法的被调用计数越多,JVM就优先翻译成机器码,当然少的可能在执行到的时候再翻译。

发布了74 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shenshaoming/article/details/102541758
今日推荐