JDK、JRE、JVM三者间的关系

JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

JDK、JRE、JVM三者的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——
在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具。
JDK(Java Development Kit)
JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
②EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
③ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
JDK、JRE、JVM三者的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——
金字塔结构 JDK=JRE+JVM+其它 运行Java程序一般都要求用户的电脑安装JRE环境(Java Runtime Environment);没有jre,java程序无法运行;而没有java程序,jre就没有用武之地。
Java Runtime Environment(JRE)
是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
RE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
JVM(java virtual machine)
就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

1. 定义

JRE(Java Runtime Enviroment)是Java的运行环境。 面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合, 包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。

JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

2. 区别

JRE主要包含:java类库的class文件(都在lib目录下打包成了jar)和虚拟机(jvm.dll);JDK主要包含:java类库的 class文件(都在lib目录下打包成了jar)并自带一个JRE。那么为什么JDK要自带一个JRE呢?而且jdk/jre/bin下的client 和server两个文件夹下都包含jvm.dll(说明JDK自带的JRE有两个虚拟机)。

记得在环境变量path中设置jdk/bin路径麽?老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所 有的命令。可是有没有人想过我们用的java命令并不是jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk /bin目录下的java.exe剪切到别的地方再运行java程序,发现了什么?一切OK!(JRE中没有javac命令,原因很简单,它不是开发环 境)那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需 要jre能让java程序跑起来就可以了,那么每个客户还需要手动去设置环境变量多麻烦啊?所以安装jre的时候安装程序自动帮你把jre的 java.exe添加到了系统变量中,验证的方法很简单,去Windows/system32下面去看看吧,发现了什么?有一个java.exe。

3. 难点

如果安装了JDK,你的电脑就有两套JRE(JRE本身和JDK中的JRE),前面这套比后面那套少了Server端的Java虚拟机。

(1)为什么Sun要让JDK安装两套相同的JRE?这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe 等),而且都放置在/lib/tools.jar里。如果我们将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结 果:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/Main。这个意思是说,你输入javac.exe与输入java -cp c:/jdk/lib/tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。 而且可以发现/lib目录下的程序都很小,不大于29K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用 程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于JDK目录下的那套JRE就是用来运行一般Java程序 的。

(2)如果一台电脑安装两套以上的JRE,谁来决定呢?这个重大任务就落在java.exe身上。java.exe的工作就是找到合适的JRE来运 行Java程序。java.exe依照以下的顺序来查找JRE:1)自己的目录下有没有JRE;2)父目录有没有JRE;3)查询注册表: [HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment]。所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。

(3)JDK-->JRE-->Bin目录下有两个文件夹:server与client,这是真正的jvm.dll所在。 jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位 于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录下的jvm.dll。

4. 最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。

 

多个JDK版本共存

背景:

         JDK 都已经发布到1.8版本了,作为一个“怀旧”的programer,我对新版本一直没什么关注。一直都是项目需要哪个版本就用哪个版本JDK,而且我一直 认为如果项目太过于依赖JDK版本的话,那开发和设计上太shit了!这几天由于一些原因需要切换到老版本的项目去做些东西。老版本(称为V1)使用的是 JDK1.6开发的,新版本(称为V2)使用的是JDK1.7。现在需要两个版本的JDK共存,本以为很简单的事情,结果出了一堆问题。囧

问题:

    1.安装了JDK1.6,copy了eclipse,get了项目代码,但是公司的eclipse插件无法运行!

    2.指定了Eclipse启动时使用的JDK为1.6,报错code 13,无法启动Eclipse!

    3.解决了Eclipse启动问题和插件问题,分别为项目(两个工作空间)指定了JDK版本,但是1.7版本的无法运行,会显示“找不到或无法加载主类错误”!

    本来这个事件是很简单的,但是由于一些小的细节失误才导致自己绕了老大一个圈子。看来细节决定成败在哪儿都适用!

总结:

    1. JDK在大版本上是允许同时存在的,但是小版本上是不允许的;

    2. Eclipse本身是一个Java程序,这我们都知道,但是Eclipse启动的时候为什么找不到一个javaw进程呢?那是因为Eclipse默认调用的是jvm.dll,如果我们指定启动参数是javaw.exe那么会启动一个javaw.exe进程。

    3.Eclipse 也会依赖一定版本的JDK,这要看你用哪个版本的Eclipse,一般来说它是向后兼容的,也就是JDK1.5能运行,JDK1.6、JDK1.7也可 以。但是不保证Eclipse的插件在不同版本的JDK上也能良好运行,比如我们公司的插件,对JDK版本依赖就很强。

    4.Eclipse可以指定编译、运行Java程序的JDK版本,这个JDK版本和它本身运行时的JDK是不一样的,或者说两者毫无关系,可以是同一个JDK。

    5.Eclipse分32位和64位,必须配合32位和64位JDK,否则会报错!

我们有时候会在windows下安装多个jdk,但是安装多个jdk会引起一些问题。

本机是安装了两个版本的jdk,一个是jdk1.8和jdk1.6。一开始是安装的jdk1.8,但是由于jdk1.8在项目中会有一些错误,所以决定还是使用jdk1.6吧。但是安装好1.6后,也配置好了环境变量。问题出现了,执行Java – version 得到


我认为是我配置jdk1.6时候把1.6版本的目录放在了1.8后面,我就去查找我的Path(这个时候我的JAVA_HOME=C:\Java1.6\jdk1.6.0_24)

C:\ProgramData\Oracle\Java\javapath;%JAVA_HOME%\bin;E:\app\Administrator\product\11.2.0\dbhome_1\BIN……

也没有问题啊。
然后我去网上寻解决问题的方法。其中有一个我认为比较好的是这样说:

        在安装JDK1.8时(本机先安装jdk1.8再安装的jdk1.6),自动将java.exe、javaw.exe、javaws.exe三个可执行文件 复制到了C:\Windows\System32目录,由于这个目录在WINDOWS环境变量中的优先级高于JAVA_HOME设置的环境变量优先级

解决方案:将C:\Windows\System32目录下的java.exe,javaw.exe,javaws.exe删除即可。开启新的命令行窗口,再执行java -version时,就得到了期望中的结果。

我去查看自己的C:\Windows\System32去查找,但是我的竟然没有,但是他给了我一个思路。我的Path是:

C:\ProgramData\oracle\Java\javapath;%JAVA_HOME%\bin;E:\app\Administrator\product\11.2.0\dbhome_1\BIN……

我就去最前面的路径去找,啊,C:\ProgramData\Oracle\Java\javapath下竟然有这三个文件(我的电脑上安装了oracle):


最后我把%JAVA_HOME%\bin放到了最前面,再次执行java – version。问题解决了:


建议:为了提高效率,把你想使用的JDK的bin路径直接放到Path的最前面。

 

转载于:https://www.cnblogs.com/bolang100/p/6929514.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

典型方法_裴礼文老师编数学分析中的典型问题与方法练习参考答案的说明

裴礼文老师编《数学分析中的典型问题与方法》练习参考答案该书共计7章36节1036页,各章由知识点总结、例题和练习组成,知识点基本按照传统《数学分析》教材先后顺序跟进。例题和练习出自《数学分析》经典习题和近年《数学分析》考研试题,极具代…

第4章 原子操作 第二节

-------------------------------------------------------------上一章节说的原子操作,有同学在下面留言说,原子操作不是万能的吧?确实是,原子操作不是万能的,体系结构在完成原子操作部分也是花费了很大的心思&#x…

表格字体缩小 php_如何快速找出两个Excel表格不同的地方?

上一篇文章介绍了如何快速找出两个word文档不同的地方,这篇文章来说说如何快速找出两个Excel表格不同的地方,这里说的两个Excel表格,可以是同一个工作簿的不同sheet,也可以是两个不同的Excel文件,如下图:黄…

周一地铁遐想

连续两周的早上8点出门到晚上12点到家,今天中午睡不着,下午调试代码的时候感觉脑子眼睛有点迷糊,旁晚吃饭的时候,有几个同学还在微信私聊我问题,因为都是加了我的知识星球的同学,咨询的是个人的规划还有以后…

再说鸿蒙

上一篇文章已经被骂狗血了,我一直想找个时间好好澄清一些东西,正好今天晚上睡不着,现在是凌晨4点,我觉得应该再发下东西,当然了,还是以我特有的尿性,没有摆事实讲道理,就是我以为。1…

shell--基本语法

继续运算符模块。 part1 算术运算符 - * / % part2 关系操作 与(&#xff08;&#xff09;)连用 < > < > ! && || 注意&#xff1a;一个等号是赋值操作&#xff0c;两个等号是判断 test命令相关&#xff0c;[]可以达到一样的效果 part3 赋值运算符 * /…

锻炼身体

这周还没有发技术文章&#xff0c;着实是因为忙晕了头&#xff0c;不过不管有多忙&#xff0c;该吃饭的时候还是吃饭&#xff0c;该打球的时候还是打球&#xff0c;打球不是为了赚钱&#xff0c;但是是为了更好的赚钱&#xff0c;很多时候忽略了一些小事情&#xff0c;往往这些…

你今天忘本了吗?

我从小在农村长大&#xff0c;我们村前面有一条很长的河&#xff0c;我家在河的后面的那个小山坡上&#xff0c;背靠着大山&#xff0c;很多大师来我们家&#xff0c;都说我家这里是风水宝地&#xff0c;幸运的是&#xff0c;我就在这块风水宝地里长大了。后来&#xff0c;我很…

评分组件开发

我们知道&#xff0c;许多外卖app都有评分的星星&#xff0c;这里我总结一下对评分组件的开发&#xff0c;学习视频&#xff1a;饿了么实战&#xff08;慕课网&#xff09; 1.html部分 <div class"star" :class"starType"><span v-for"itemC…

第4章 第三节 内核同步

抢占式内核和非抢占式内核Linux 内核有两个空间&#xff0c;一个是内核空间一个是用户空间&#xff0c;如果一个进程正在内核态执行的时候&#xff0c;允许内核打断他的执行&#xff0c;让另一个进程执行&#xff0c;那么这个内核就是可抢占式内核。还有一种情况就是&#xff0…

第四章 第四节 per_cpu

我们上一章说了实现内核同步的方法很多&#xff0c;如下表技术说明适用范围每CPU变量在CPU之间复制数据结构所有CPU原子操作对一个计数器原子地“读-修改-写”的指令所有CPU内存屏障避免指令重新排序本地CPU或所有CPU自旋锁加锁时忙等所有CPU信号量加锁时阻塞等待所有CPU顺序锁…

python的三维图片_python如何做三维图

Python三维绘图在遇到三维数据时&#xff0c;三维图像能给我们对数据带来更加深入地理解。python的matplotlib库就包含了丰富的三维绘图工具。1、创建三维坐标轴对象Axes3D创建Axes3D主要有两种方式&#xff0c;一种是利用关键字projection3dl来实现&#xff0c;另一种则是通过…

为何要使用docker

可能很多人听说过docker&#xff0c;也可能有很多人用过&#xff0c;但是其中的一些细节&#xff0c;可能不是很清楚&#xff0c;还有一些人&#xff0c;像我一样&#xff0c;并不知道docker&#xff0c;也没有用过&#xff0c;刚好最近一个大神朋友比较有空&#xff0c;让他写…

如何解决文件不存在_传奇微端配置Pak密码文件不存在怎么解决?传奇分享汇

在架设gom引擎的版本时&#xff0c;你是否有遇到和我一样的情况呢&#xff1f;微端配置后pak密码文件不存在是怎么回事呢&#xff1f;今天分享pak密码文件不存在的解决方法为什么会出现pak密码文件不存在呢&#xff1f;总结分析有以下2种原因会导致文件不存在1、没有配置对应的…

linux 统计命令执行后的行数或者统计目录下文件数目

ls |wc 是统计你这个目录下的文件数目。ls |wc -l是输出第一个结果即31即文件的数目。 转载于:https://www.cnblogs.com/apple2016/p/6956814.html

那些年,我们在?的那些日子

刚好在今天&#xff0c;我们几个比较好的朋友&#xff0c;都离开了一起奋斗的A公司。 先说明下&#xff0c;这个不是虚构的小说&#xff0c;也不是吹牛逼&#xff0c;就是记录我们几个曾经辉煌和落魄的日子&#xff0c;起名A公司也是为了保护大家的隐私&#xff0c;但是事情肯定…

db2 sql执行历史_5 个免费的在线 SQL 数据库环境,比Navicat 香!

来源&#xff1a;blog.csdn.net/horses/article/details/108603935作者&#xff1a;不剪发的Tony老师文章目录SQL FiddleDB Fiddledb<>fiddleSQL OnlineOracle Live SQL总结今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们…

嵌入式入门必读

找到一个非常好的书籍而且不用购买的而且是高清版本的原来是放在我的知识星球里面的看到大家下载的也很多现在拿出来分享给大家从单片机到嵌入式这个不是一个简单的过程&#xff0c;其中从单进程到多进程&#xff0c;一个CPU如何做到多进程&#xff0c;怎么跑系统&#xff0c;调…

mysql远程访问 linux_Linux中开启mysql远程访问功能

1、确认3306是否对外开放&#xff0c;mysql默认状态下是不开放对外访问功能的。查看的办法如下&#xff1a;# netstat -an | grep 3306tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN从结果可以看出&#xff0c;mysql的3306端口只监听本地的连接&#xff0c;这样就阻碍了外部IP对该数…

致敬云南滑翔机

今天晚上&#xff0c;看了期待已久的篮球节目&#xff0c;我要打篮球&#xff0c;11点左右&#xff0c;感觉特别困&#xff0c;已经快睡着了&#xff0c;准备关掉电视的时候看到林书豪的图片&#xff0c;林书豪头上有一个标题《我要打篮球》&#xff0c;这个不就是《这&#xf…