首先我们需要清楚JDK/JRE/JVM的关系和各自的用途。
JDK全称是Java Development Kit,是Java开发工具包,其中包括jjavac编译器,heap以及jconsole等监控工具;
JRE全称是Java Runtime Enviroment 是Java运行环境,其中提供了Class Library核心类库和JVM虚拟机;
JVM全称是Java Virtual Machine,是Java虚拟机,用来运行编译好的Java可运行程序。
Java的执行过程
编译:通过javac指令,使用JDK编译器,将.java文件编译成可执行的.class文件
执行:通过java指令,用Jvm虚拟机,执行.class文件。
Java为什么可以实现跨平台?
总体来说是分为两个原因:
第一,Java对于不同的平台,相同的源代码编译出来的字节码是一致的,所以字节码在各大平台是通用的;
第二,对于不同的平台,有不同的JVM版本,在执行字节码时,不同版本的JVM可以将字节码转成自己平台的机器指令;
由此,Java实现了跨平台。
JDK静态编译器
Java通过JDK提供的静态编译器,将源代码转成字节码:
词法分析:通过空格分隔出代码中的单词,操作符,控制符等信息,将其转换成Token交给语法分析;
语法分析:将Tiken流信息按照Java语法规则转成一棵语法树;
语义分析:对语法树进行关键词使用、类型匹配、作用域等语义检查;
字节码:完成语义检查后,生成字节码文件。
JVM的执行方式
JVM是以解释+编译方式执行的,会将字节码文件转换成机器指令交给CPU执行。
为了提高效率,JVM会在运行的同时进行热点统计,统计一些较高使用频率的方法调用、循环、公共模块等等,JVM会基于JIT即时编译器将这些模块转成机器码直接交给CPU执行,提高效率。
JVM解释器:程序执行时JVM解释器首先发挥作用,省去了编译器的编译时间,提高效率;
JIT即时编译器:随着执行时间推移,即时编译器开始发挥作用,将热点代码编译成本地代码,由CPU直接运行。