分为两个部分:
部分一:javac部分 将源代码文件通过javac的指令生成相应的class文件
部分二:java部分 class文件通过classLoader加载内存中,还需支持相应的java类库 比如说String.class或是Object.class。调用字节码解释器或者JIT即时编辑器,来进行解释和编译,编译之后会由执行引擎开始执行,执行引擎对应的就是操作系统和硬件,我们可以把这个java指令的部分的流程看成JVM。
字节码解释器和JIT即时编辑器:
其实两者是可以混合的,针对特别常用的代码,会把代码做成一种即时编译的,需要本地的支持,那么在下次使用的时候就不需要解释器对代码一行一行的解释执行。执行引擎可以将代码直接交给操作系统,让其进行调用。这个效率要高很多,当然也不是说所有的代码都要被JIT即时编译器执行。java是一个跨平台的语言,如果他是即时编译的话,那么就满足不了跨平台的特点
跨平台的语言 ---- Java
跨语言的平台 ---- JVM
除了Java语言,JVM还支持很多其他的语言,根据调查显示大概支持100多种语言。这些语言都可以在JVM虚拟机上进行执行。
其实JVM他就是一种规范。它帮我们屏蔽了操作系统的底层,包括Linux、Unix、Windows等操作系统。
那么JVM如何决定其他语言可以在JVM上执行呢?
任何语言,只要能够生成class文件,那么他就能够在JVM上执行。
如果没有class文件生成,可以通过程序内部编译生成类似的class文件的二进制流,那么也是可以在JVM上执行的。所以JVM和Java其实没有任何关系的。
究竟什么是跨平台,就是我们在编写Java程序时,可以在Linux、Unix、Windows等等操作系统上执行,且不需要修改东西。以前的c语言和c++都是做不到的。
JVM是一种规范,定义了Java虚拟机能够执行什么,那么这种规范是如何进行定义的。
JVM官方文档网址:https://docs.oracle.com/javase/specs/.index.html
https://docs.oracle.com/en/java/javase/15/
The Java Language Specification, Java SE 18 Edition
The Java Virtual Machine Specification, Java SE 18 Edition
虚拟机是虚拟出来的机器
内存的管理,堆栈方法区等 ---- 我们后面再说。。。
HotSpot — Oracle官方 我们做实验用到最多的 通过Java-version指令查看安装的JVM是哪种实现
JROKit — BEA 曾经号称世界上最快的JVM,后来被Oracle收购,与HotSpot合并
J9 — IBM
Microsoft VM — Microsoft
J9和Microsoft VM都是大厂商出产,不会依赖oracle的东西(技术),他们有自己的平台,因为版本问题,他们都去自己开发平台。
TaobaoVM — HotSpot定制版 淘宝专属定制,阿里天猫都在使用这款虚拟机
LiquidVM 直接针对硬件 它其实是没有操作系统的,运行效率会更高
Azul zing GC 垃圾回收机制的业界标杆,它的垃圾回收在1ms以内 土豪版本,价格相当昂贵 常用于银行、电信
阿里有10人以内可以做JVM开发 p9-p10-p11级别
网传Java收费问题:在HotStop8版本以后将不再提供升级了,如果要升级到更高版本则需要收费,是根据企业去做的商业行为,与开发者关系不大。
JDK、JRE以及JVM的关系
JVM(Java Virtual Machine):虚拟机 用于执行class文件 来执行程序的
JRE(Java RunTime Enviroment):Java运行时环境 除了虚拟机以外还需要Java的核心包、Java的类库要进行加载,能够支持Java的运行
JDK(Java Development Kit):Java的开发工具包,支持Java程序的运行以及编译 JRE+JVM