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

概述

本章主要了解JDK,JRE和JVM之间的区别。JVM是如何工作的?什么是类加载器,解释器和JIT编译器。还有一些面试问题。

Java程序执行过程

在深入了解Java内存区域之前,我们先了解Java源文件是如何执行的。

  1. 我们使用编辑器在Simple.Java文件中编写源代码。
  2. 程序必须编译成字节码。编译器(javac)将源代码编译为Simple.class文件。
  3. 此后缀为.class的类文件可以在任何平台/操作系统的的JVMJava虚拟机)中执行。
  4. JVM负责将字节码转换为机器可执行的本机机器代码。

什么是JVM?

Java虚拟机(JVM)是​​运行Java字节码的虚拟机。可以通过javax.java文件编译成.class文件。.class文件包含JVM可解析的字节码。

事实上,JVM只是为Java字节码提供了运行时环境和规范。不同的厂商提供此规范的不同实现。例如,此Wiki页面列出了其它JVM实现

最受欢迎的JVM虚拟机是Oracle公司提供的Hostspot虚拟机,(前身是Sun Microsystems,Inc.)。

JVM虚拟机使用许多先进技术,结合了最新的内存模型,垃圾收集器和自适应优化器,为Java应用程序提供了最佳性能。

JVM虚拟机有两种不同的模式,client模式和server模式。尽管serverclient相似,但server进行了特殊调整,以最大程度地提高峰值运行速度。它用于长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不是快速启动或较小的运行时内存占用量。开发人员可以通过指定-client-server来选择所需的模式。

JVM之所以称为虚拟机,是因为它提供的API不依赖于底层操作系统和机器硬件体系结构。这种与硬件和操作系统的独立性是Java程序一次写入,随处运行必要基础。

JVM架构

类加载器

类加载器是用于加载类文件到JVM中。主要分为以下三步 加载,链接和初始化。

  1. 加载
  • 为了加载类,JVM有3种类加载器。Bootstrap, extension和应用程序类加载器。
  • 加载类文件时,JVM会找到这个类的所有依赖项。
  • 首先类加载会判断当前类加载器是否存在父类,如果存在则交给父加载器加载。
  • Bootstrap为根类加载器,Bootstrap加载器尝试查找该类。它扫描JRE lib文件夹中的rt.jar
  • 如果找不到类,那么extension加载器将在jre \ lib \ ext包中搜索类文件。
  • 如果还找不到类,则应用程序类加载器将在系统的 CLASSPATH环境变量中搜索所有Jar文件和类
  • 任何类加载程序找到了类,则由该类加载器加载类;否则抛出ClassNotFoundException
  1. 链接 : 类加载器加载类后,将执行链接。字节码验证程序将验证生成的字节码是否正确,如果验证失败,我们将收到验证错误。它还会对类中的静态变量和方法执行内存分配。
  2. 初始化 : 这是类加载的最后阶段,此处将为所有静态变量分配原始值,并执行静态块。
JVM内存区域

JVM中的内存区域分为多个部分,以存储应用程序数据的特定部分。

  • 方法区:存储类结构,例如类的基本信息,常量运行时池和方法代码。
  • 堆:存储在应用程序执行期间创建的所有对象。
  • 栈:存储局部变量和中间结果。所有这些变量对于创建它们的线程都是私有的。每个线程都有自己的JVM栈,并在创建线程时同时创建。因此,所有此类局部变量都称为线程局部变量。
  • PC寄存器:存储当前正在执行的语句的物理内存地址。在Java中,每个线程都有其单独的PC寄存器。
  • 本地方法区:许多底层代码都是用C和C ++等语言编写的。本地方法栈保存本机代码的指令。

JVM执行引擎

分配给JVM的所有代码均由执行引擎执行。执行引擎读取字节码并一一执行。它使用两个内置的解释器和JIT编译器将字节码转换为机器码并执行。

使用JVM,解释器和编译器均会生成本机代码。不同之处在于它们如何生成本机代码,其优化程度以及优化成本。

解释器

JVM解释器通过查找预定义的JVM指令到机器指令的映射,几乎将每个字节码指令转换为相应的本机指令。它直接执行字节码,不执行任何优化。

JIT编译器

为了提高性能,JIT编译器在运行时与JVM交互,并将适当的字节码序列编译为本地机器代码。通常,JIT编译器采用一段代码(和解释器一次一条语句不一样),优化代码,然后将其转换为优化的机器代码。

默认情况下,JIT编译器处于启用状态。您可以禁用JIT编译器,在这种情况下,解释器将要解释整个Java程序。除了诊断或解决JIT编译问题外,不建议禁用JIT编译器。

什么是JRE

Java运行时环境(JRE)是一个软件包,它将库(jar)和Java虚拟机以及其他组件捆绑在一起,以运行用Java编写的应用程序。JRE只是JVM的一部分。

要执行Java应用程序,只需要在计算机中安装JRE。 这是在计算机上执行Java应用程序都是最低要求。

JRE包含了以下组件–

  1. Java HotSpot客户端虚拟机使用的DLL文件。
  2. Java HotSpot服务器虚拟机使用的DLL文件。
  3. Java运行时环境使用的代码库,属性设置和资源文件。例如rt.jar和charsets.jar。
  4. Java扩展文件,例如localedata.jar。
  5. 包含用于安全管理的文件。这些文件包括安全策略(java.policy)和安全属性(java.security)文件。
  6. 包含applet支持类的Jar文件。
  7. 包含供平台使用的TrueType字体文件。

JRE可以作为JDK的一部分下载,也可以单独下载。JRE与平台有关。您可以根据您的计算机的类型(操作系统和体系结构)选择要导入和安装的JRE软件包。

比如,你不能在32位计算机上安装64JRE。同样,用于WindowsJRE发行版在Linux上将无法运行。反之亦然。

什么是JDK

JDKJRE更加全面。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软件包时请多加注意。

JDK,JRE和JVM之间的区别

基于以上讨论,我们可以得出以下这三者之间的关系

JRE = JVM + libraries to run Java application.

JDK = JRE + tools to develop Java Application.

简而言之,如果你是编写代码的Java应用程序开发人员,则需要在计算机中安装JDK。但是,如果只想运行用Java内置的应用程序,则只需要在计算机上安装JRE

JDK,JRE和JVM相关的面试问题

如果你理解我们在这篇文章中讨论的内容,那么面对任何面试问题都不难。不过,还是要准备好回答如下问题:

什么是JVM架构

上面已经详细解释过了。

Java有几种类型的类加载器

Bootstrap, extension、应用程序类加载器和自定义类加载器。

类加载器是如何在Java中工作的?

类加载器会在其预定义位置扫描jar文件和类。他们扫描路径中的所有那些类文件,并查找所需的类。如果找到它们,则加载,链接并初始化类文件。

jre和jvm的区别?

JVM是用于运行Java应用程序的运行时环境的规范。Hotspot JVM是规范的这样一种实现。它加载类文件,并使用解释器和JIT编译器将字节码转换为机器代码并执行。

解释器和jit编译器的区别?

解释器逐行解释字节码并顺序执行。这会导致性能下降。JIT编译器通过分析块中的代码来为该过程添加优化,然后准备更多优化的机器代码。

JDK 和 JRE下载


java教程系列二:Java JDK,JRE和JVM分别是什么?的更多相关文章

  1. java‘小秘密’系列(二)---Integer

    java'小秘密'系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java'小秘 ...

  2. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  3. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  4. Difference between JDK, JRE and JVM

    With Java programming language, the three terms i.e. JDK, JRE and JVM will always be there to unders ...

  5. java学习之Java中JDK,JRE和JVM之间的关系(转载)

    最近要重新抓一下java,大量扫技术文档,保存下来供自己查阅.以下转载自http://www.cnblogs.com/xiaofeixiang/p/4085159.html 初学JAVA很容易被其中的 ...

  6. java多线程系列(二)

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  7. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  8. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  9. Java基础知识 ——JDK,JRE和JVM

    1.开发简单的Java程序过程: 名词解释: JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行 ...

随机推荐

  1. Okhttp3源码解析(3)-Call分析(整体流程)

    ### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...

  2. c++智能指针介绍

    C++11标准引入了boost库中的智能指针,给C++开发时的内存管理提供了极大的方便.接下来这篇文件介绍shared_ptr/weak_ptr内部实现原理及使用细节. C++不像java有内存回收机 ...

  3. 12款好用超赞的国外搜索资源网站 ,开发者们的标配,你都知道吗?不知道就OUT了

    简介 看了 看了网上有好多推荐插件的文章,很少有推荐搜索资源网站,于是今天决定推荐一波搜索资源网站.这些网站带给我开阔视眼增长知识.所以在这里整理一下,分享给朋友和博友们. 学习技术过程我们经常需要使 ...

  4. 亲,麻烦给个五星好评!—RatingBar

    引言 上一篇的CheckBox已经让大家越来越接近实战演练了,本章我们继续分享干货给大家,今天介绍一个实用的UI控件RatingBar(星级评分条),对于使用过电商APP(某东,某宝等)的小伙伴们来说 ...

  5. 【2017cs231n】:课程笔记-第2讲:图像分类

    [2017cs231n]:课程笔记-第2讲:图像分类 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  6. 怎样使用U盘安装Windows系统

    准备工作 一个8G及以上的U盘: 软碟通UltraISO,下载地址,非免费,但试用就够了: 系统镜像,推荐去MSDN下载: 安装过程 利用U盘制作启动盘,准备好上述的东西,然后开始制作启动盘: 注意: ...

  7. Delphi - 使用Pos、Copy函数定位和截取字符串

    使用Pos函数来定位子字符串第一次出现的位置 函数定义: Function Pos(Substr: String, S: String): Integer; 表示取出Substr在S中第一次出现的位置 ...

  8. P1613 跑路 倍增思想 + 邻接矩阵

    题意 给定一个有向图,每条边的花费为1.现在有一个空间跑路器,可以走2^k长度的路,只用花1秒的时间.问从1走到n最少的时间.n <= 50, k <= 64. 思路 这道题说是倍增,但是 ...

  9. codeforces 820 C. Mister B and Boring Game(找规律)

    题目链接:http://codeforces.com/contest/820/problem/C 题解:显然a<=b的规律很好找只要 例如a=2,b=5,只要这样排列就行abbbbbbabbbb ...

  10. lightoj 1030-B - Discovering Gold (概率dp)

    题意:有一个直线的金矿,每个点有一定数量的金子:你从0开始,每次扔个骰子,扔出几点就走几步, 然后把那个点的金子拿走:如果扔出的骰子超出了金矿,就重新扔,知道你站在最后一个点:问拿走金 子的期望值是多 ...