问题思考:
JAVA语言具有两大特性,第一,‘Compile once, run anywhere’即一次编译,到处运行,通俗来讲就是跨平台运行;第二就是垃圾收集器(Garbage collection)分配内存,开发人员不需要关注内存的分配与回收。
JAVA解决了跨平台运行,这是与C++等语言不同的,实现的跨平台并不是因为java语言具有跨平台的特性,而是由于jvm可以将java语言生成的字节码解释运行在各个操作系统,通过jvm这一中间层,实现了对操作系统的解耦。使开发人员不需要关注代码的操作系统的差异。
JAVA是解释运行这句话不完全正确,我们开发的JAVA源代码先被编译成字节码,在运行时,通过jvm转换为可执行的机器码,有部分热点代码可通过jit编译器(动态编译器)直接编译为可运行的机器码。
JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块等。而JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
Java语言特性,包括泛型、Lambda等语言特性;
基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。
知识拓展:
JIT编译
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码。
通常javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译。非常显然,经过解释运行,其运行速度必定会比可运行的二进制字节码程序慢。为了提高运行速度,引入了JIT技术。
在执行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,採用该JIT技术能够,能够接近曾经纯编译技术。
JIT是just in time,即时编译技术。使用该技术,可以加速java程序的运行速度。
JIT并不总是奏效,不能期望JIT一定可以加速你代码运行的速度,更糟糕的是她有可能减少代码的运行速度。这取决于你的代码结构,当然非常多情况下我们还是可以如愿以偿的。
从上面我们知道了之所以要关闭JITjava.lang.Compiler.disable(); 是由于加快运行的速度。由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这样的情况,当前的JIT仅仅对常常运行的字节码进行编译,如循环等
AOT编译
AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式
Java 9引入了aot编译方式,能够将class文件直接编译成可执行二进制文件。目前Java 9的early access版本已经提供了编译工具,注意:按照JEP 295描述,目前版本的AOT,仅支持64位Linux操作系统。
AOT可能带来的好处,是JVM加载这些已经预编译成二进制库之后,可以直接调用,而无需再将其运行时编译成二进制码。理论上,AOT的方式,可以减少JIT带来的预热时间,减少Java应用长期给人带来的“第一次运行慢”感觉。