多情只有春庭月,犹为离人照落花。

本章主要了解JDK,JRE和JVM之间的区别。JVM是如何工作的?什么是类加载器,解释器和JIT编译器。还有一些面试问题。
在深入了解Java内存区域之前,我们先了解Java源文件是如何执行的。
Simple.Java文件中编写源代码。javac)将源代码编译为Simple.class文件。.class的类文件可以在任何平台/操作系统的的JVM(Java虚拟机)中执行。JVM负责将字节码转换为机器可执行的本机机器代码。
Java虚拟机(JVM)是运行Java字节码的虚拟机。可以通过javax将.java文件编译成.class文件。.class文件包含JVM可解析的字节码。
事实上,JVM只是为Java字节码提供了运行时环境和规范。不同的厂商提供此规范的不同实现。例如,此Wiki页面列出了其它JVM实现。
最受欢迎的JVM虚拟机是Oracle公司提供的Hostspot虚拟机,(前身是Sun Microsystems,Inc.)。
JVM虚拟机使用许多先进技术,结合了最新的内存模型,垃圾收集器和自适应优化器,为Java应用程序提供了最佳性能。
JVM虚拟机有两种不同的模式,client模式和server模式。尽管server和client相似,但server进行了特殊调整,以最大程度地提高峰值运行速度。它用于长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不是快速启动或较小的运行时内存占用量。开发人员可以通过指定-client或-server来选择所需的模式。
JVM之所以称为虚拟机,是因为它提供的API不依赖于底层操作系统和机器硬件体系结构。这种与硬件和操作系统的独立性是Java程序一次写入,随处运行必要基础。

类加载器是用于加载类文件到JVM中。主要分为以下三步 加载,链接和初始化。
JVM有3种类加载器。Bootstrap, extension和应用程序类加载器。JVM会找到这个类的所有依赖项。Bootstrap为根类加载器,Bootstrap加载器尝试查找该类。它扫描JRE lib文件夹中的rt.jar。extension加载器将在jre \ lib \ ext包中搜索类文件。CLASSPATH环境变量中搜索所有Jar文件和类ClassNotFoundException。JVM中的内存区域分为多个部分,以存储应用程序数据的特定部分。
JVM栈,并在创建线程时同时创建。因此,所有此类局部变量都称为线程局部变量。分配给JVM的所有代码均由执行引擎执行。执行引擎读取字节码并一一执行。它使用两个内置的解释器和JIT编译器将字节码转换为机器码并执行。

使用JVM,解释器和编译器均会生成本机代码。不同之处在于它们如何生成本机代码,其优化程度以及优化成本。
JVM解释器通过查找预定义的JVM指令到机器指令的映射,几乎将每个字节码指令转换为相应的本机指令。它直接执行字节码,不执行任何优化。
为了提高性能,JIT编译器在运行时与JVM交互,并将适当的字节码序列编译为本地机器代码。通常,JIT编译器采用一段代码(和解释器一次一条语句不一样),优化代码,然后将其转换为优化的机器代码。
默认情况下,JIT编译器处于启用状态。您可以禁用JIT编译器,在这种情况下,解释器将要解释整个Java程序。除了诊断或解决JIT编译问题外,不建议禁用JIT编译器。
Java运行时环境(JRE)是一个软件包,它将库(jar)和Java虚拟机以及其他组件捆绑在一起,以运行用Java编写的应用程序。JRE只是JVM的一部分。
要执行Java应用程序,只需要在计算机中安装JRE。 这是在计算机上执行Java应用程序都是最低要求。
JRE包含了以下组件–
JRE可以作为JDK的一部分下载,也可以单独下载。JRE与平台有关。您可以根据您的计算机的类型(操作系统和体系结构)选择要导入和安装的JRE软件包。
比如,你不能在32位计算机上安装64位JRE。同样,用于Windows的JRE发行版在Linux上将无法运行。反之亦然。
JDK比JRE更加全面。JDK包含JRE拥有的所有部门以及用于开发,调试和监视Java应用程序的开发工具。当需要开发Java应用程序时,需要JDK。
JDK附带的几个重要组件如下:
与JRE一样,JDK也依赖于平台。因此,在为您的计算机下载JDK软件包时请多加注意。
基于以上讨论,我们可以得出以下这三者之间的关系
JRE = JVM + libraries to run Java application.
JDK = JRE + tools to develop Java Application.
简而言之,如果你是编写代码的Java应用程序开发人员,则需要在计算机中安装JDK。但是,如果只想运行用Java内置的应用程序,则只需要在计算机上安装JRE。
如果你理解我们在这篇文章中讨论的内容,那么面对任何面试问题都不难。不过,还是要准备好回答如下问题:
上面已经详细解释过了。
Bootstrap, extension、应用程序类加载器和自定义类加载器。
类加载器会在其预定义位置扫描jar文件和类。他们扫描路径中的所有那些类文件,并查找所需的类。如果找到它们,则加载,链接并初始化类文件。
JVM是用于运行Java应用程序的运行时环境的规范。Hotspot JVM是规范的这样一种实现。它加载类文件,并使用解释器和JIT编译器将字节码转换为机器代码并执行。
解释器逐行解释字节码并顺序执行。这会导致性能下降。JIT编译器通过分析块中的代码来为该过程添加优化,然后准备更多优化的机器代码。