问题
谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗?
典型回答
Java本身是一种面向对象语言,最显著的特性有两个方面,一是所谓的“一次编译,到处执行”(Compile once,run anywhere),能够非常容易的获得跨平台能力;另外就是垃圾收集(GC,Garbage Collection),Java通过垃圾收集器(Garbage Collection)回收分配内存,大部分情况下程序员不需要自己操心内存分配和回收。
我们日常会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit)。JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块。二JDK可以看做是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
对于“Java是解释执行”这句话,这个说法不太准确。我们开发的Java的源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码转换为最终的机器码。但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
知识扩展
对于Java平台的理解,可以从很多方面简明扼要的谈一下,例如:Java语言特性,包括泛型、Lambda等语言特性;基础类库,包括集合、IO/BIO、网络、并发、安全等基础类库。
或者谈谈JVM的一些基础概念和机制,比如Java的类加载机制,常用版本JDK(如JDK 8)内嵌的Class-Loader,例如 Bootstrap、Application和Extension Class-loader;类加载大致过程;加载、验证、连接、初始化;自定义Class-Loader等。还有垃圾收集器的基本原理,最常见的垃圾收集器,如 SerialGC、ParallelGC、CMS、G1等。