1.初识JVM
什么是JVM?
JVM本质上是一个程序,它的职责是运行Java字节码文件(.class)。
源代码文件是.java,使用javac编译(javac是Java编译器的前端部分,这个过程主要是进行语法检查,不涉及性能优化),变成Java字节码文件.class,之后JVM将.class文件解释为机器码。通过不同平台上的不同JVM将字节码文件解释成对应平台的机器码,能够让Java源代码“一次编译,到处运行”。
JVM的功能?
JVM的一个重要功能是即时编译(Just in time)。我们都知道,Java是一门解释型语言(或者说是半编译,半解释型语言)。Java通过编译器javac先将源程序编译成与平台无关的Java字节码文件(.class),再由JVM解释执行字节码文件,从而做到平台无关。 但是,有利必有弊。对字节码的解释执行过程实质为:JVM先将字节码翻译为对应的机器指令,然后执行机器指令。很显然,这样经过解释执行,其执行速度必然不如直接执行二进制字节码文件。为了提高执行速度,便引入了 JIT 技术。当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”编译成本地机器相关的机器码,并进行优化,然后再把编译后的机器码缓存入内存,以备下次使用。
当 JVM 执行代码时,它并不是立即开始编译代码的。如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。反之,如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,那么编译就非常值得了。因此,编译器具有的这种权衡能力会首先执行解释后的代码,然后再去分辨哪些方法会被频繁调用来保证其本身的编译。Hot Spot VM 采用了 JIT compile 技术,将运行频率很高的字节码直接编译为机器指令执行以提高性能,所以当字节码被 JIT 编译为机器码的时候,要说它是编译执行的也可以。
总结一下:即时编译是指JVM在解释字节码文件的时候,如果发现了出现频率很高的代码(热点代码),就会直接将这部分代码编译成机器码然后写入内存中以方便之后调用。这就是一个性能上的优化了。
常见的JVM?
其中,HotSpot是最广泛的虚拟机,对Java的意义非常重大。