Java -- 每日一问:谈谈你对 Java 平台的理解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java -- 每日一问:谈谈你对 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 虚拟机的存在密不可分,可在不同的环境中运行。比如说 Windows 平台和 Linux 平台都有相应的 JDK,安装好 JDK 后也就有了 Java 语言的运行环境。其实 Java 语言本身与其他的编程语言没有特别大的差异,并不是说 Java 语言可以跨平台,而是在不同的平台都有可以让 Java 语言运行的环境而已,所以才有了 Java 一次编译,到处运行这样的效果。

严格的讲,跨平台的语言不止 Java 一种,但 Java 是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java 虚拟机和 DOS 类似,相当于一个供程序运行的平台。

程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java 在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将 Java 源代码转化成 .CLASS 文件字节码,这是第一次编译。 .class 文件就是可以到处运行的文件。然后 Java 字节码会被转化为目标机器代码,这是是由 JVM 来执行的,即 Java 的第二次编译。

“到处运行”的关键和前提就是 JVM。因为在第二次编译中 JVM 起着关键作用。在可以运行 Java 虚拟机的地方都内含着一个 JVM 操作系统。从而使 JAVA 提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,java 并不是编译机制,而是解释机制。Java 字节码的设计充分考虑了 JIT 这一即时编译方式,可以将字节码直接转化成高性能的本地机器码,这同样是虚拟机的一个构成部分。

你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。


以上是关于Java -- 每日一问:谈谈你对 Java 平台的理解?的主要内容,如果未能解决你的问题,请参考以下文章

每日一面——谈谈你对JVM的运行时数据区的理解

Java -- 每日一问:谈谈接口和抽象类有什么区别?

Java -- 每日一问:谈谈你知道的设计模式?

Java -- 每日一问:谈谈 finalfinally finalize 有什么不同?

Java -- 每日一问:谈谈你的GC调优思路?

Java -- 每日一问:谈谈接口和抽象类有什么区别?