JVM JRE JDK三者的区别和联系_等待你的蜕变的博客-程序员资料

技术标签: java  

一、 详细介绍
1、JVM -- java virtual machine
JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。
JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行 时操作不同的内存区域。 JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方 法、主机硬件、主机操作系统无关。但是在一些小的方面, JVM 的实现也是互不相同的,比如 垃圾回收  算法, 线程调度 算法(可能不同 OS 有不同的实现)。 
JVM 的主要工作是解释自己的指令集(即字节码)到 CPU 的指令集或 OS 的系统调用,保护用户免被恶意程序骚扰。 JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file )。类文件的 组成包括 JVM 指令集,符号表以及一些补助信息。
2、JRE -- java runtime environment
JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 在JDK的安装目 录里你可以找到jre目录,里面有两个文件夹bin和lib,在 这里可以认为bin里的就是jvm,lib中则是jvm工 作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个. class文件  和jre一起打包发给朋友,这样你的朋友就 可以运行你写程序了。(jre里有运行.class的java.exe)
JRE 是 Sun 公司发布的一个更大的系统,它里面就有一个 JVM 。 JRE 就与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本。同 JVM 一起组成 JRE 的还有一些 API (如 awt , swing 等)。 JRE 是运行 Java 程序必不可少的。
JRE ( Java Runtime Environment ),是运行 Java 程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的 地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
JRE里面有一个 JVM , JRE 与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本,,同 JVM 一起组成 JRE 的还有 一些 API (如 awt , swing 等), JRE 是 运行 Java 程序必不可少的.
3、JDK -- java development kit
JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包 含JVM。
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
(注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的)总的来说JDK是用于java程序的开发,而jre则 是只能运行class而没有编译的功能。
eclipse、idea等 其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你 选中jre路径就ok了。
二、 三者联系
Java 喊出的带有标志性的口号“ Write Once , Run Anywhere (一次编写,到处运行)”,正是建立在 JRE 的基础之上。何以实现?就是在 Java 应用程序和操作系统之间增加了一虚拟层—— JRE 。
程序源代码不是直 接编译、链接成机器代码,而是先转化到字节码( bytecode ) 这种特殊的中间形式,字节码再转换成机器码或系统调用。前者是传统的编译方法,生成的机器代码就不可避免地跟特殊的操作系统和特殊的机器结构相关。
而 Java 程序的字节码文件可以放到任意装有 JRE 的计算机运行,再由不同 JRE 的将它们转化成相应的机器代码,这就实现了 Java 程序的 可移植性 。这样程序员也不用去 关心程序运行的具体环境,而可以专心编写软件。这种分层抽象、隐藏细节的思想在 计算机科学 中处处可见,比如机器组织结构的设计、网络协议的实现等。 Pascal 语言的发明者 Niklaus Wirth ,就富有预见性地指出应该有这样一种可移植的语言,其生成的中间代码可以在一台假想的机器( a hypothetical machine )上运行。
而 Java 虚拟机( Java virtual machine 或 JVM )就是这样的一台机器,它模拟实际处理器的结构,解释字节码。 怎么一会说是 JRE ,一会儿又成了 JVM ,两者是否同物不同名? 回答是否定的。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
要运行Applet,在客户端必须安装有 JRE,即“运行时”,容易一点理解,就象所谓的“插件”,要开发JAVA应用程序\Web应用,就必须在 服务器端 安装相应的 JVM+JDK 了(开发应用 Java web应用 时,客户端不需要安装任何的JVM)
如果你使用JAVA开发应用,就需要安装 JRE+JDK,就是 J2SE. 
如果在客户端运行Applet,客户端浏览器必须嵌有JAVA JVM,如果没有,就需要安装,即: 在客户端创建JRE(运行时,包含JVM),而客户端是不需要做开发的,所以,JDK就没有必要安装 了。

不同版本的Applet在不同的JVM下可能无法正常运行,而Microsoft JVM只是Sun JVM的“低版本”,微软在windows xp/2003中干脆将JVM去掉了.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

很多朋友可能跟我一样,已经使用JAVA开发很久了,可是对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的。今天特写此文,来整理下三者的关系。

JDK : Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。

最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了属于自己的JDK,例如国外IBM公司开发了属于自己的JDK,国内淘宝也开发了属于自己的JDK,各个组织开发自己的JDK都是为了在某些方面得到一些提高,以适应自己的需求,比如IBM的JDK据说运行效率就比SUN的JDK高得多。但不管怎么说,我们还是需要先把基础的Sun JDK掌握好。

JDK有以下三种版本:

J2SE,standard edition,标准版,是我们通常用的一个版本;J2EE,enterprise edition,企业版,使用这种JDK开发J2EE应用程序;J2ME,micro edition,主要用于移动设备、嵌入式设备上的java应用程序。

我们常常用JDK来代指Java API,Java API是Java的应用程序接口,其实就是前辈们写好的一些java Class,包括一些重要的语言结构以及基本图形,网络和文件I/O等等 ,我们在自己的程序中,调用前辈们写好的这些Class,来作为我们自己开发的一个基础。当然,现在已经有越来越多的性能更好或者功能更强大的第三方类库供我们使用。

JRE:Java Runtime Environment(java运行时环境)。也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。

JVM:Java Virtual Machine(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file )。类文件的组成包括 JVM 指令集,符号表以及一些辅助信息。

下图很好地表现了JDK,JRE,JVM三者间的关系:​

图片网址来自JavaSE复习笔记

我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。


转自:http://java-mzd.iteye.com/blog/838514



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a236209186/article/details/51742693

智能推荐

java.lang.NoClassDefFoundError: javax/servlet/ServletContext_橙子cch的博客-程序员资料

@java.lang.NoClassDefFoundError: javax/servlet/ServletContextTOCjava.lang.NoClassDefFoundError: javax/servlet/ServletContext使用idea 开发项目,启动时报如下错误"D:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:D:\Program Files\IntelliJ IDEA Community Editi

史上最全的程序员求职渠道总结_yuwang668的博客-程序员资料

我前前后后写过多篇与程序员找工作相关的文章,比如程序员跳槽神级攻略,找工作的辟邪剑谱,任性,春节前辞职,程序员该不该考虑初创公司,这些文章都收录在我的漫谈程序员专栏里,它们从跳槽时机、跳槽原因、简历优化等不同侧面讨论了程序员找工作的那些事儿,受到很多人的关注。今天呢,我准备专门分析一下程序员求职渠道,有料是必须的,就算你搜遍互联网深挖全宇宙,也会发现这篇文章将是史上最全、最强、最有针对性的程序员求

java解析过程_【JVM系列】一步步解析java执行过程_令和时代的柯南的博客-程序员资料

对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?.....当然,本篇文章的粒度可能稍微侧重于宏观方面,更细粒度的技术分析,需要在接下来的该系列文章中与大家分享....一 编写java源程序j...

Android9.0无法加载http的url,net::ERR_CLEARTEXT_NOT_PERMITTED_一只小白程序员的博客-程序员资料

从Android 9.0(API级别28)开始,默认情况下禁用明文支持。因此http的url均无法在webview中加载附上我使用的解决办法:<?xml version="1.0" encoding="utf-8"?><manifest ...> <uses-permission android:name="android.permission...

使用HTML5+CSS+JS框架有那些好处_js+css的优势_qianduankuangjia的博客-程序员资料

相信很多程序猿朋友都用过框架,不过你是否知道你用的是HTML框架、CSS框架还是JS框架,其实这都不重要,重要的是使用框架的目的是什么?是不是节约了开发项目时间陈本,这事多么伟大的一箱工程,根据几年前的一片文章中写到,使用前端框架的优劣势,从这边文章中整理出一部分分享给大家。

docket常用命令_已运行docket run -d -t强行给容器进程发kill_amdiandds的博客-程序员资料

Docker是什么?开源软件部署方案,轻量级应用容器框架,可以打包发布任何,运行,任何应用。为什么要用Docket?

随便推点

Nt vs. Zw - Clearing Confusion On The Native API _yebikangfu的博客-程序员资料

The NT native API is nothing new. It’s been discussed ad nauseum, it’s been exploited by umpteen different utilities, and portions of it have even migrated into the realm of the fully documented and s

【评测】一种组织蛋白快速提取方法_“泽平科技”公众号24h在线答疑的博客-程序员资料

以往认为脂肪组织是单纯能量储存器官,但随着脂肪组织在能量控制、炎症反应和免疫应答方面重要作用的验证,其已被确认也是一个内分泌器官。脂肪组织不仅响应来自传统内分泌系统和中枢神经系统的传入信号,还表达和分泌具有重要功能的细胞因子,包括瘦素(Leptin)、炎性细胞因子、脂联素(adiponectin)、补体成分、纤溶酶原激活物抑制剂-1(PAI-1)、肾素-血管紧张素系统蛋白和抵抗素(Resistin)等。脂肪组织中除了脂肪细胞外,还有干细胞、前脂肪细胞、巨噬细胞、嗜中性粒细胞、淋巴细胞和内皮细胞等。这些不

Spring Boot 动态定时任务---quartz(不需要重启服务)_quartz的任务 修改类用不用重新启动_qianhuan_的博客-程序员资料

一、配置文件quartz.properties#ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)org.quartz.scheduler.instanceId=AUTO#指定调度程序的主线程是否应该是守护线程org.quartz.scheduler.makeSchedulerThreadDaemon=true#ThreadPool实现的类名org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool#Thread

项目包红叉,jar包冲突问题_微笑面对疾风的博客-程序员资料

项目包红叉,jar包冲突问题 先去maven库里,删除低版本jar包,然后返回项目重新更新下载jar包。即可解决。

HtmlUnit初步使用心得_XaverSun的博客-程序员资料

HtmlUnit初步使用心得HtmlUnit是一款开源的java 页面分析工具,读取页面后,可以有效的使用HtmlUnit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。

Android JetPack组件之Lifecycle初探_Silencemuyi的博客-程序员资料

前言话说JetPack已经出现了好久了,并且自己的项目中也使用过相关的东西,但是,却没有系统的学习和使用以下,各个部分中的东西。近来刚好有时间,学习了部分东西,想着光说不练嘴把式,特此记录以下方便自己以后理解和学习。首先写这篇文章之前我们先要搞懂什么是JetPack组件,它里面又包含了什么?JetPack组件是什么?Android Jetpack 组件是库的集合,这些库是为协同工作而构建的,不过也可以单独采用,同时利用 Kotlin 语言功能帮助您提高工作效率。可全部使用,也可混合搭