了解JDK,JRE和JVM之间的区别。JVM是如何工作的?什么是类加载器,解释器和JIT编译器。还检查一些面试问题。
1.执行Java程序
在进入Java内部之前,让我们了解如何执行Java源文件。
我们Simple.Java使用编辑器或IDE(集成开发环境)(例如Eclipse或IntelliJ Idea)在文件中编写Java源代码。
程序必须编译成字节码。Java编译器(javac)将源代码编译为Simple.class文件。
此类文件可以在JVM(Java虚拟机)的任何平台/操作系统中执行。
JVM将字节码转换为机器可执行的本机机器代码。
什么是JVM?
Java虚拟机(JVM)是运行Java字节码的虚拟机。您可以通过将.java文件编译为文件来获取此字节码.class。.class文件包含JVM可以理解的字节码。
在现实世界中,JVM是一种规范,提供了可以在其中执行Java字节码的运行时环境。不同的供应商提供此规范的不同实现。例如,此Wiki页面列出了不同的JVM实现。
JVM最受欢迎的实现是由Oracle Corporation拥有和提供的Hotspot。(以前是Sun Microsystems,Inc.)。
JVM使用许多先进技术,结合了最新的内存模型,垃圾收集器和自适应优化器,为Java应用程序提供了最佳性能。
JVM有两种不同的风格- 客户端和服务器。尽管服务器VM和客户端VM相似,但已经对服务器VM进行了特殊调整,以最大程度地提高峰值运行速度。它用于执行长时间运行的服务器应用程序,这些应用程序需要比快速启动时间或较小的运行时内存占用更多的最快的运行速度。开发人员可以通过指定-client或选择他们想要的系统-server。
JVM之所以称为虚拟机,是因为它提供的机器接口不依赖于底层操作系统和机器硬件体系结构。与硬件和操作系统的这种独立性是Java程序一次写入,随处运行的价值的基石。
JVM架构
1.类加载器
类加载器是用于加载类文件的子系统。它执行三个主要功能,即类加载,链接和初始化。
1.1 载入中
- 为了加载类,JVM有3种类加载器。 Bootstrap,Execution和 Application。
- 加载类文件时,JVM会发现某个任意类的依赖项 XYZ.class。
- 第一个引导程序类加载器尝试找到该类。它将扫描rt.jarJRE lib文件夹中的文件。
- 如果找不到类,那么扩展类加载器将在jre \ lib \ ext文件夹中搜索类文件
- 再次,如果找不到类,则应用程序类加载器将在CLASSPATH系统的环境变量中搜索所有Jar文件和类
- 如果以上类加载器没有找到,则由Application 类加载器加载;否则ClassNotFoundException抛出。
1.2 连结中
由类加载器加载类后,将执行链接。一个字节码验证器将验证生成的字节码是否正确与否,如果验证失败,我们将得到一个验证错误。它还对类中找到的静态变量和方法执行内存分配。
1.3 初始化
这是类加载的最后阶段,在这里所有静态变量将被分配原始值,并且将执行静态块
JVM内存区域
JVM中的内存区域分为多个部分,以存储应用程序数据的特定部分。
- 方法是存储类结构,如元数据,常量运行时池和方法代码。
- 方法是存储类结构,如元数据,常量运行时池和方法代码。
- 堆存储在应用程序执行期间创建的所有对象。
- 堆栈存储局部变量和中间结果。所有这些变量对于创建它们的线程都是本地的。每个线程都有自己的JVM堆栈,该堆栈在创建线程时同时创建。因此,所有此类局部变量都称为线程局部变量。
- PC寄存器存储当前正在执行的语句的物理内存地址。在Java中,每个线程都有其单独的PC寄存器。
- Java也支持并使用本机代码。许多底层代码都是用C和C ++等语言编写的。本机方法堆栈保存本机代码的指令。
2.2 JVM执行引擎
分配给JVM的所有代码均由执行引擎执行。执行引擎读取字节码并一一执行。它使用两个内置的解释器和JIT编译器 将字节码转换为机器代码并执行。
2.2.1。Interpreter 口译员
JVM解释器通过查找预定义的JVM指令到机器指令的映射,几乎将每个字节码指令转换为相应的本机指令。它直接执行字节码,不执行任何优化。
2.2.2 JIT Compiler
为了提高性能,JIT编译器在运行时与JVM进行交互,并将适当的字节码序列编译为本地机器代码。通常,JIT编译器采用一段代码(每次一次都没有一个语句作为解释器),优化代码,然后将其转换为优化的机器代码。
默认情况下,JIT编译器处于启用状态。您可以禁用JIT编译器,在这种情况下,将解释整个Java程序。除诊断或解决JIT编译问题外,不建议禁用JIT编译器。
3.什么是JRE?
在Java运行时环境(JRE)是一个软件包,其中捆绑库(jars)和Java虚拟机,和其他组件用Java运行的应用程序。JVM只是JRE发行版的一部分。
要执行任何Java应用程序,您需要在计算机中安装JRE。在任何计算机上执行Java应用程序都是最低要求。
JRE捆绑了以下组件–
- Java HotSpot 客户端虚拟机使用的DLL文件。
- Java HotSpot 服务器虚拟机使用的DLL文件。
- Java运行时环境使用的代码库,属性设置和资源文件。例如rt.jar和charsets.jar。
- Java 扩展文件,例如localedata.jar。
- 包含用于安全管理的文件。这些文件包括安全策略(java.policy)和安全属性(java.security)文件。
- 包含applet支持类的Jar文件。
- 包含供平台使用的TrueType字体文件。
JRE可以作为JDK的一部分下载,也可以单独下载。JRE与平台有关。这意味着您必须根据计算机的类型(操作系统和体系结构)选择要导入和安装的JRE软件包。
例如,您不能64-bit在32-bit计算机上安装JRE发行版。同样,Windows的 JRE发行版在Linux中将无法运行;反之亦然。
4. 什么是JDK?
JDK是JRE的超集。JDK包含JRE拥有的所有内容以及用于开发,调试和监视Java应用程序的开发工具。需要开发Java应用程序时需要JDK 。
JDK附带的几个重要组件如下:
- appletviewer –此工具可用于在没有Web浏览器的情况下运行和调试Java applet
- apt –注释处理工具
- extcheck –一种检测JAR文件冲突的实用程序
- javadoc –文档生成器,可从源代码注释自动生成文档
- jar –归档程序,它将相关的类库打包到一个JAR文件中。该工具还有助于管理JAR文件
- jarsigner – jar签名和验证工具
- javap –类文件反编程序
- javaws – JNLP应用程序的Java Web Start启动器
- JConsole – Java监视和管理控制台
- jhat – Java堆分析工具
- jrunscript – Java命令行脚本外壳
- jstack –打印Java线程的Java堆栈跟踪的实用程序
- keytool –用于操作密钥库的工具
- policytool –策略创建和管理工具
- xjc – XML绑定Java API(JAXB)API的一部分。它接受XML模式并生成Java类
与JRE一样,JDK也依赖于平台。因此,在为您的计算机下载JDK软件包时请多加注意。
5. JDK,JRE和JVM之间的区别
基于以上讨论,我们可以得出以下三个方面的关系–
JRE = JVM +运行Java应用程序的库。
JDK = JRE +开发Java应用程序的工具。
简而言之,如果您是编写代码的Java应用程序开发人员,则需要在计算机中安装JDK。但是,如果只想运行用Java内置的应用程序,则只需要在计算机上安装JRE。
6.与JDK,JRE和JVM有关的面试问题
如果您了解到目前为止我们在本文中讨论的内容,那么面对任何面试问题都不会困难。尽管如此,请准备回答以下问题:
- 什么是JVM体系结构?
- Java中有几种类型的类加载器?
有3种装载机。Bootstrap,extension 和application。 - Java中的类加载器如何工作?
类加载器扫描其预定义的位置以查找jar文件和类。他们扫描路径中的所有这些类文件,并查找所需的类。如果找到它们,请加载,链接并初始化类文件。 - JRE和JVM之间的区别?
JVM是用于运行Java应用程序的运行时环境的规范。热点JVM是规范的这样一种实现。它加载类文件,并使用解释器和JIT编译器将字节码转换为机器代码并执行。
JRE 是Java的运行时最小环境 - 解释器和JIT编译器之间的区别?
解释器逐行解释字节码并顺序执行。这会导致性能不佳。JIT编译器通过分析块中的代码来为该过程添加优化,然后准备更优化的机器代码。