JDK、JRE 和 JVM

JDK : Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
  最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了属于自己的JDK,例如国外IBM公司开发了属于自己的JDK,国内淘宝也开发了属于自己的JDK,各个组织开发自己的JDK都是为了在某些方面得到一些提高,以适应自己的需求,比如IBM的JDK据说运行效率就比SUN的JDK高的多。
  JDK有以下三种版本:
  J2SE,standard edition,标准版。J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序。J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序
 
JRE:Java  Runtime  Enviromental(java运行时环境)。也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM、JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
 
JVM:Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。
  Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让java程序与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file)。类文件的组成包括 JVM 指令集,符号表以及一些补助信息。
 
JDK,JRE,JVM三者间的关系
 
 
我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
  
Java\jdk\bin这个bin下有各种java程序需要用到的命令,与Java\jdk\jre\bin 和 Java\jre\bin的bin目录最明显的区别就是Java\jdk\bin下才有javac.exe。
因为 jre只是一个运行环境而已,与开发无关。正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的 jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。
 
java中的两个jre
 如果安装了JDK,会发现你的电脑有两套JRE,一套位于C:\Java\jdk\jre ,另外一套位于 C:\Java\jre目录下,后面这套比前面那套少了Server端的Java虚拟机
  1、为什么Sun要让JDK安装两套相同的JRE?这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 java\jdk\lib\tools.jar 里。若先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/main 这个意思是说异常,找不到类文件。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。 JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程 序,也必须要自行附一套JRE才行。位于C:\Java\jre目录的那套JRE就是用来运行一般Java程序用的, java\jdk\jre是用来开发程序的。 
  2、如果一台电脑安装两套以上的JRE,谁来决定呢?这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行 Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。 
  3、介绍JVM JRE目录下的Bin目录有两个目录:server与client。这就是真正的jvm.dll所在。 jvm.dll无法单独工作。因此想使用哪个JVM,只需要设置PATH。 
原文地址:https://www.cnblogs.com/windlaughing/p/2984001.html