Java本身是一种面向对象语言,最显著特征有两个方面,一个是非常容易获得跨平台能力,还有就是GC,Java通过垃圾收集器回收分配内存。 JRE 也就是Java运行环境,包含了JVM 和Java类库,以及一些模块。 JDK 可以看作是JRE 的超集,提供更多的工具,比如编译器 、各种诊断工具等 。 Java是解释执行这句话说法不太准确。 Java源代码——通过javac编译成为字节码bytecode ,——在运行时通过JVM 内嵌的解释器将字节码转换成最终的机器码。 但是常见的JVM ,比如Oracle JDK 提供的Hotspot JVM ,都提供了JIT(Just-In-Time) 编译器,也就是动态编译器 ,能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行 ,而不是解释执行 。 扩展 对于Java平台的理解,可以从多方面谈一下: · Java语言特性——泛型、Lambda · 基础类库——集合、IO/NIO、网络、并发、安全等 · JVM基础概念和机制——Java类加载机制、垃圾收集基本原理 深入探讨一下解释执行和编译执行的问题: 通常把Java分为编译期和运行时。javac的编译,编译Java源码生成.class 文件里面实际是字节码 ,而不是可以直接执行的机器码 。Java通过字节码和Java虚拟机这种跨平台的抽象,屏蔽了操作系统和硬件的细节。这是实现一次编译,到处执行 的基础。 在运行时,JVM 会通过类加载器Class-Loader 加载字节码,解释或者编译执行。Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如-Xint ——JVM只进行解释执行。这种模式抛弃了JIT带来的优势,因为解释器是逐条读入,逐条解释运行的。比如-Xcomp ——JVM关闭解释器,不进行解释执行,这可能导致JVM 启动变慢很多。 除了常见的Java使用模式,还有新的编译方式——AOT(Ahead-of-Time-Compilation) 直接将字节码编译成机器代码,这样避免了JIT 预热等各方面的开销。Oracle JDK 支持分层编译和AOT协作使用。 |