《极客时间》:谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的”书写一次,到处运行“(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾回收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
我们日常会接触到 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。
个人理解 Java 平台应该包含三个部分:
-
Java 语言
-
Java 虚拟机
-
Java 生态
首先说 Java 语言
-
它是一门面向对象的高级语言
-
跨平台:一次编译,到处运行
-
提供了丰富的基础类库,包括集合、IO、网络、并发等
-
Java 语言本身不进行垃圾回收
-
JDK 提供很多工具,可以进行诊断、监控等
Java 虚拟机
-
JVM 是 Java 语言的运行环境,在不同操作系统安装不同的虚拟机,提供 Java 语言跨平台的能力
-
JVM 运行的是 .class 文件,只要其要求的文件,都可以被执行,并不关心文件来源,如 Groovy、Scala、JRuby、Kotlin 等
-
JVM 的运行时数据区:程序计数器、栈、堆、本地方法栈、方法区、运行时常量池、直接内存
-
JVM 的垃圾回收
-
判断对象是否死亡的算法,如引用计数算法、可达性分析算法等
-
垃圾收集算法,如分代收集、标记复制、标记整理等
-
垃圾收集器,如 CMS、G1 等
-
-
JVM 的执行引擎
-
解析执行
-
编译执行
-
最后是 Java 生态
-
各种丰富的第三方框架,提供了各种各样的功能
-
活跃的社区和论坛,可以找到各种问题的解决方案
-
业界非常多的系统都基于 Java 编写
总结:Java 入门简单,精通难