JVM基础入门
Java跨平台语言
Java是一门跨平台语言,所谓跨平台,就是Java源文件会被编译成为字节码文件(.class文件),不管是Windows,Linux还是Mac,都有其适配的JVM,也就是字节码文件可以随意在这些JVM上去运行。
Write once,run anywhere.
其他的语言,例如c语言,编译成为机器码之后,由于底层的机器语言支持不一样,编译后的机器语言文件是不可以跨操作系统运行的。而Java则是把兼容的工作交给了JVM。不同的JVM负责去适配不同的操作系统。
所有的Java虚拟机都遵守java虚拟机的规范,语言编写者不需要考虑兼容问题。
JVM跨语言的平台
JVM是跨语言的平台,很多语言都可以编译成为遵守规范的字节码,这些字节码都可以在Java虚拟机上运行。Java虚拟机不关心这个字节码是不是来自于Java程序,只需要各个语言提供自己的编译器,字节码遵循字节码规范,比如字节码的开头是CAFE BABY。
何为字节码?
字节码狭义上是java语言编译而成,但是由于JVM是支持多种语言编译的字节码的,而字节码都是一个标准规范,因为我们应该称其为JVM字节码。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同操作系统上的不同JVM中运行。因此,Java虚拟机实际上和Java语言并非强制关联的关系,只和二级制文件(Class文件)强关联。
where is JVM?
java从编码到执行
编译:通过 javac 将源码文件(.java文件)编译成JVM可以解释的class文件(.class文件)。
加载:将编译后的class文件由 ClassLoader 加载到JVM中,还会加载一些需要的java类库。
解释:把字节码转换为操作系统可识别的指令。在解释阶段会有两种方式把字节码信息解释成机器指令码,一个是字节码解释器、一个是即时编译器(JIT)。
JVM会对热点代码做编译,非热点代码直接进行解释。当JVM发现某个方法或代码块运行特别频繁时,就有可能把这部分代码认定为热点代码。使用热点探测来检测是否为热点代码。热点探测一般有两种方式,计数器和抽样。HotSpot使用的是计数器的方式进行探测,为每个方法准备了两类计数器:方法调用计数器和回边计数器。这两个计数器都有一个确定的阈值,当计数器超过阈值溢出了,就会触发JIT编译。即时编译器把热点方法的指令码保存起来,下次执行的时候就无需重复的进行一句一句的解释执行,直接执行缓存的机器语言,效率会高很多。
执行:解释后交给执行引擎,最后由执行引擎交给操作系统供其调用 。
jvm是一种规范
java virtual machine specifications详细信息可以查阅下面文档:
JDK 13 Documentation - Home。 不同版本有不同文档,此文档是Java13版本的文档。
Java虚拟机是抽象的计算机。 像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。 使用虚拟机实现编程语言是相当普遍的。