为什么要解释java字节码?

Kev*_*rke 13 java interpreter jit bytecode

据我所知,Java编译为Java字节码,然后可以由任何运行Java的机器解释其特定的CPU.Java使用JIT来解释字节码,我知道这样做的速度非常快,但为什么语言设计者一旦检测到正在运行的特定机器,就不会静态编译成机器指令?是否每次通过代码解释字节码?

Edw*_*rzo 19

原始设计的前提是"编译一次运行".因此,虚拟机的每个实现者都可以运行编译器生成的字节码.

题为Masterminds for Programming的书中,James Gosling解释道:

詹姆斯:没错.这些天我们总是打败真正优秀的C和C++编译器.当你转到动态编译器时,当编译器在最后一刻运行时,你会获得两个优势.一个是你确切知道你正在运行的芯片组.很多时候,当人们编译一段C代码时,他们必须编译它以在通用x86架构上运行.你得到的二进制文件几乎都没有特别适合它们.您下载了Mozilla的最新副本,它几乎可以在任何英特尔架构CPU上运行.几乎有一个Linux二进制文件.它非常通用,它是用GCC编译的,它不是一个非常好的C编译器.

当HotSpot运行时,它确切地知道您正在运行的芯片组.它确切知道缓存的工作原理.它确切地知道内存层次结构如何工作.它确切地知道所有管道互锁在CPU中如何工作.它知道这个芯片有哪些指令集扩展.它可以精确地优化您所使用的机器.然后另一半是它实际上看到应用程序正在运行.它能够获得知道哪些事情很重要的统计数据.它能够内联C编译器永远不会做的事情.在Java世界中内联的东西非常惊人.然后,您将了解存储管理与现代垃圾收集器的工作方式.使用现代垃圾收集器,存储分配非常快.


Fre*_*Foo 7

Java的通常编译成机器指令; 这就是即时(JIT)编译.但是,默认情况下,Sun的Java实现仅对经常运行的代码执行此操作(因此启动和关闭字节码,仅执行一次,仍然会被解释为防止JIT开销).


And*_*ite 5

对于很多情况,字节码解释通常"足够快".另一方面,编译相当昂贵.如果在1%的代码中花费了90%的运行时间,那么只编译1%并将其他99%单独留下来要好得多.

  • JIt的*真正优势在于,这1%可能是静态编译器*无法*优化的东西. (5认同)