`
生亦何欢
  • 浏览: 11463 次
社区版块
存档分类
最新评论

JRE, JDK, JVM, JIT的区别(转载)

    博客分类:
  • java
阅读更多
[size=medium]http://swiftlet.net/archives/639

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,一套位于C:\Program Files\Java\jre6, 另外一套位于 C:\Program Files\Java\jdk1.6.0_41\jre目录下。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java
PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。
1、为什么Sun要让JDK安装两套相同的JRE?
这是因为JDK里面有很多用Java所编写的开发工具,如javac.exe、jar.exe等,这些命令放置在 C:\Program Files\Java\jdk1.6.0_41\bin目录里。
因为他们是java编写的命令,所以要依靠java的jar包,这些jar包存放在C:\Program Files\Java\jdk1.6.0_41\lib目录里
如果将C:\Program Files\Java\jdk1.6.0_41\lib\目录里面的tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main
但是输入 java -cp C:\Program Files\Java\jdk1.6.0_41\lib\tools1.jar com.sun.tools.javac.Main
会得到与javac.exe相同的结果。
从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。
而且我们可以发现C:\Program Files\Java\jdk1.6.0_41\bin目录下的程序都很小,不大于29K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于C:\Program Files\Java\jdk1.6.0_41\jre目录下的那套JRE就是用来运行一般Java程序用的。
2、如果一台电脑安装两套以上的JRE,谁来决定呢?
这个重大任务就落在java.exe身上。java.exe的工作就是找到合适的JRE来运行Java程序。 java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。(本文于2015年6月6日修订)
小提醒:此时的记忆会随着时间的推移而遗忘,温故而知新,建议大家及时把本文收藏下来,以后慢慢回味。

JRE & JVM
JVM -- java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行,类似于C#中的CLR。

JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE,如果讲的具体点就是bin目录下的jvm.dll文件, jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位 于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录下的jvm.dll。


JVM & JIT(zz)

http://blogzhoubo.iteye.com/blog/1703871
首先,需要了解JVM对字节码的编译技术。一个JAVA程序通过javac编译成字节码以后,在执行的时候,由JVM将字节码编译成本地机器码,然后再执行。将字节码转换成
机器码,JVM有两种利器,一种就是JIT,还有一种是转译器(interpreter)。

1>转译器

转译器将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。

2>JIT

针对转译器的速度瓶颈,出现了JIT。JIT针对一个具体的class进行编译,经过编译后的程序,被优化成相当精简的原生型指令码(native code)。编译过一次,下次再执行的时候就不用再次编译了,所以执行次数较多的代码,采用JIT还是十分划算的。但是,JIT也不是万能的,比如:某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,这时候就不如直接使用转译器。

所以,转译器和JIT各有优缺点。
1>极少执行到或者执行次数较少的Java代码,使用转译器更划算。
2>重复执行或者执行次数较多的Java代码,采用JIT更划算。

然后,我们回到JVM远程调试的正题。我们一般debug程序的时候,只是关注其中的一部分代码,而且大部分情况下是设置断点,然后单步执行,而JIT的编译单位是class,只要我们执行了class里面的代码,JIT就会对整个class进行编译,而我们实际执行的代码一般都是其中的一部分代码,所以从整个时间效率上来看,采用JIT反而更费时间。也就是说在JVM远程调试这个事情上,禁用JIT(只使用转译器,解释一行执行一条)更合理,所以通过-Djava.compiler=NONE来禁止JIT。


此外,在程序中也可以即时地禁用和开启JIT。
java.lang.Compiler.disable();

java.lang.Compiler.enable();

分享到:
评论

相关推荐

    Java中JDKJRE和JVM解析.doc

    ### Java中的JDK、JRE与JVM解析 #### 一、引言 在Java编程领域,JDK、JRE和JVM这三个概念是至关重要的基础知识点。虽然它们经常被提及,但很多人仍然对它们之间的关系和各自的功能感到困惑。这篇文章将深入探讨这...

    Java中的数据类型及JDK, JRE, 和 JVM解释及关系.zip

    在Java的世界里,了解数据类型、JDK(Java Development Kit)、JRE(Java Runtime Environment)以及JVM(Java Virtual Machine)的关系至关重要,它们是Java程序运行的基础。 首先,让我们深入探讨Java中的数据...

    openjdk8u60+jvm jdk源码+jvm源码

    JDK 是开发和运行 Java 应用程序所需的一组工具和库的集合,包括 JRE(Java Runtime Environment)和开发工具。 JVM(Java Virtual Machine)是 JDK 的核心组成部分,它负责执行字节码,提供了一个“一次编写,到处...

    java1.8jdk/jre.rar

    Java 1.8 JDK/JRE 是Java开发工具包和Java运行环境的组合,对于任何Java开发者来说都是必不可少的基础。在本压缩包中,你将找到用于编写、编译和运行Java应用程序的所有必要组件。让我们深入了解一下这两个核心组件...

    jdk6u43 64位,jdk/jre完整版

    在JDK 6中,HotSpot虚拟机使用了Just-In-Time (JIT) 编译器,能够动态优化代码,提高运行效率。 3. **JRE**(Java Runtime Environment):包含了运行Java应用程序所需的基本组件,包括Java虚拟机(JVM)、类库以及...

    jdk1.6.0_20

    8. 性能提升:通过优化JIT(Just-In-Time)编译器和内存管理,JDK 1.6在许多场景下都实现了性能提升。 三、文件结构 "jdk1.6.0_20"压缩包内通常包含以下主要文件和目录: - bin:存放可执行命令,如javac、java、...

    jdk1.8.0_281.zip

    JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,它包含了Java运行环境(JRE)、编译器、调试器以及其他工具,使得开发者能够编写、测试和部署Java应用。JDK 1.8.0_281是这个...

    jdk-8u391-windows-x64

    JDK 8u391是Oracle公司发布的一个针对Windows x64平台的更新版本,它包含了Java运行时环境(Java Runtime Environment,JRE)和一系列开发工具,如Java编译器(javac)、Java调试器(jdb)、Java文档生成器(javadoc...

    java运行环境jre

    JVM通过Just-In-Time (JIT) 编译器将部分字节码转化为机器码,从而提高程序的运行效率。JVM的内存模型,包括堆、栈、方法区等,对于理解和优化Java程序的性能至关重要。 描述中提到的"jar包"是Java Archive的缩写,...

    Jre 8 64位

    Java运行环境(JRE,全称Java Runtime Environment)是Java应用程序执行所需的基础组件,它包含了Java虚拟机(JVM)、类库以及其他支持Java程序运行的必要组件。在本例中,我们讨论的是JRE 8的64位版本,这是针对64...

    jre6 java运行环境免安装版

    7. **性能优化**: JRE6中包含的JVM进行了多方面的性能优化,例如更高效的垃圾回收算法、更快的字节码解释器以及对Java代码的即时编译(JIT),这些都显著提升了Java程序的运行速度。 8. **API更新**: JRE6还引入了...

    Oracle JDK11 Windows 压缩版

    Oracle JDK11的JVM采用了JIT(Just-In-Time)编译器,能提高程序运行效率。 3. **Java运行时环境(JRE)**:JRE是运行Java应用程序所必需的环境,包括JVM、类库和其他必要的组件。 4. **Java应用启动器(java)**...

    Java Runtime Environment JRE 1.4.2

    在性能方面,JRE 1.4.2引入了Just-In-Time (JIT) 编译器的优化,能够将频繁执行的热点代码转换为本地机器码,显著提高了执行速度。此外,它还加强了Java的内存模型,确保了多线程环境下的正确性和一致性。 最后,...

    jre1.8.0_131.rar

    Java Runtime Environment(JRE)是Java开发工具集(Java Development Kit,JDK)的一个组成部分,主要负责提供Java程序运行所需的环境。JRE1.8.0_131是Oracle公司发布的一个特定版本,它包含了Java虚拟机(JVM)、...

    jdk-21-windows-x64-bin.zip

    JDK 21的JRE可能会更新JVM的HotSpot或OpenJ9实现,提供更好的性能和内存管理,比如改进的JIT编译器、新的垃圾收集器策略等。 4. **开发工具**:JDK还包括一系列开发工具,如Javadoc(用于生成API文档)、JAR(打包...

    jdk1.4.2_08

    其次,Java虚拟机(JVM)是JDK的核心部分,负责执行Java应用程序。JDK1.4.2_08中的JVM可能增强了垃圾收集机制,提高了内存管理效率,降低了程序运行时的内存消耗。此外,这个版本可能还优化了Just-In-Time(JIT)...

    jdk1.8.0_161.zip

    3. **Java运行时环境(JRE)**:虽然JRE不是直接包含在JDK中,但JDK安装会同时安装JRE,它包含了运行Java应用所需的基本组件,如JVM、核心类库等。 4. **开发工具**:如`jar`命令用于打包和管理Java档案文件,`...

    JVM 77 道面试题及答案.docx

    JRE、JDK、JVM 及 JIT JRE 代表 Java 运行时,是运行 Java 应用所必须的。JDK 代表 Java 开发工具,是 Java 程序打开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机,是运行 Java 应用的责任。JIT ...

    jdk17中文说明文档

    4. **JVM(Java虚拟机):** 包括内存模型、垃圾收集、类加载机制、JIT编译器优化等内容。 5. **模块系统(Project Jigsaw):** JDK 9引入的模块系统,增强了代码的组织和封装。 6. **Java编程最佳实践:** 如...

Global site tag (gtag.js) - Google Analytics