1. 谈谈你对 Java 平台的理解
Java 本身是一种面向对象的语言, 最显著的特性有两个方面, 一是所谓的 "一次编译, 到处运行"(Compile once,run anywhere), 能够非常容易地获取跨平台能力; 另外就是垃圾收集 (GC,Garbage Collection),Java 通过垃圾收集器(Garbage Collector) 回收分配内存, 大部分情况下, 程序员不需要自己操心内存的分配和回收.
"一次编译, 到处运行" 说的是 Java 语言跨平台的特性, Java 的跨平台特性与 Java 虚拟机的存在密不可分, 可在不同的环境中运行. 比如说 Windows 平台和 Linux 平台都有相应的 JDK, 安装好 JDK 后就有了 Java 语言的运行环境. 其实 Java 语言本身与其他的编程语言没有特别大的差异, 并不是说 Java 语言可以跨平台而是在不同的平台都有可以让 Java 语言运行的环境而已, 所以才有了 Java 一次编译, 到处运行这样的效果.
严格的讲, 跨平台的语言不止 Java 一种, 但是 Java 是较为成熟的一种."一次编译, 到处运行" 这种效果跟编译器有关. 编程语言的处理需要编译器和解释器. Java 虚拟机和 DOS 类似, 相当于一个供程序运行的平台.
程序从源代码到运行的三个阶段: 编码 -- 编译 -- 运行, 调试. Java 在编译阶段则体现了跨平台的特性. 编译过程大概是这样的: 首先将 Java 源代码转化成 .class 字节码文件, 这是第一次编译;.class 字节码就是可以到处运行的文件, 然后 .class 字节码会被转化成目标机器码, 这是由 JVM 来执行的, 即 Java 的第二次编译.
"到处运行" 的关键和前提就是 JVM, 因为在第二次编译中 JVM 起着关键作用. 在可以运行 Java 虚拟机的地方都内含着一个 JVM 操作系统. 从而使 Java 提供了各种不同平台上的虚拟机制, 因此实现了 "到处运行" 的效果. 需要强调的一点是, Java 并不是编译机制, 而是解释机制. Java 字节码的设计充分考虑了 JIT 这一即时编译方式, 可以将字节码直接转化成高性能的本地机器码, 这同样是虚拟机的一个构成部分.
Java 代码编译是由 Java 源码编译器来完成, 流程图如下所示:
Java 字节码的执行是由 JVM 执行引擎来完成, 流程图如下所示:
(ps: 摘自 Java 核心技术 36 讲)
来源: https://www.cnblogs.com/tangjian07/p/11145401.html