JVM、JRE、JDK的纠葛

        Java编程以来,一直都没有了解过编程背后的机制。以下三个名词,每次听到都感觉很熟悉,但又缺少了对它们真正的了解。

JDK(Java Development Kit)            ——java开发工具包

JRE(Java Runtime Environment)    ——java运行环境

JVM(Java Virtual Mechine)             ——java虚拟机

        下面这张图就可以说明这三者的关系:JDK包含了JRE,而JRE中又包含了JVM。那我们就从简单到复杂一步一步分析:JVM——JRE——JDK。
       

        JVM,顾名思义,可以理解为一个虚拟出来的计算机。它具备计算机的基本运算方式,并且有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。正如大家所知,Java语言最重要的特点就是跨平台运行,也正因为以上原因,JVM成为了java实现跨平台的核心部分,那么,JVM是如何实现跨平台的呢?它主要负责将java程序生成的字节码文件(.class)解释成具体系统平台上的机器指令,让具体平台如window运行这些Java程序,也就是说,class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行,这样就实现了跨平台。简而言之,使用JVM就是为了支持与操作系统无关的程序运行,实现跨平台。

        JRE,即java的运行环境,只有JVM而没有JRE是不可以运行java程序的。打开JRE的目录会看到如下左图内容:在bin目录下的server目录中(下右图)可以找到JVM(jvm.dll即java虚拟机),而lib文件夹下则是JVM工作所需要的类库。JVM在解析class文件时,需要调用类库lib才可以工作,而这两者,刚好构成了JRE。所以说,JRE是java的运行环境,安装了JRE就可以运行java程序了。换句话说,JRE只能用于运行,它面向的是java程序的使用者,而不是开发者。
        

        JDk,又称J2SDK(Java2 Software Development Kit),是java开发工具包,如上文所说,它包括了JRE,此外,它还包括一些java工具(编译器javac.exe、打包工具jar.ext、调试器jdb.exe、工具类库tools.jar等)和java标准类库(Java APT、基础类库rt.jar等)。下图是JDK目录下的文件:src是类库源码压缩包,还有一些声明文件,而运行java程序时起作用的其实是bin(存放编译器和工具,几个常用工具介绍如下) include(用于编译本地方法的文件)、jre(java运行环境的文件)、lib(存放类库文件)这四个文件夹,而db是java的内嵌数据库。

       

【bin目录下的几个常用工具】:

Javac:Java编译器,将Java源代码转换成字节码。
Java:Java解释器,直接从类文件执行Java应用程序字节代码。
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javadoc:根据Java源码及说明语句生成HTML文档。
Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

 

        以上就是JVM、JRE、JDK三者的主要介绍,细心者不难发现,在JRE和JDK中都包含了bin和lib这两个目录,那它们又有什么区别呢?简单地说,JDK中的是用于java程序开发的,而JRE 中的只能运行class而没有编译的功能。

        而对于它们的关系也有一个比较清晰的认识了,这里总结一下:JVM是将字节码文件转换成具体系统平台的机器指令;JRE即JVM+Java核心类库;JDK则是JRE+Java开发工具。那我们平时开发java程序的步骤也就清晰了:首先利用JDK开发出自己的java程序,通过JDK中的编译工具(javac)将这些源文件(.java)编译成字节码文件(.class),在JRE上运行这些字节码文件,JVM解析了这些字节码文件后,映射到相应的操作系统的系统调用。这样就完成了java程序的执行。

【附录】:

        JDK发展以来经历了很多版本的改进,而其升级后的新特性也是我们所需要了解的,以下是JDK1.5到JDK1.8的一些新特性。具体讲解请读者自行查找。

【JDK1.5】

1.自动装箱与拆箱:装箱时只需将值赋给一个类型包装器引用,java就会自动创建一个对象;拆箱时只

   需将该对象值赋给一个基本类型即可。
2.枚举:把集合里的对象元素一个一个提取出来,使代码更具可读性,理解清晰,易于维护。
3.静态导入:static方法可以直接调用,而不需要用类名调用。
4.可变参数:参数列表的参数个数可变。
5.内省:对于类的某个属性,可自动添加getter和setter方法。
6.泛型:在编译时刻进行类型检查,避免类型强制转换可能引起的运行错误。
7.For-Each循环:又称增强型for循环,简化了集合的遍历。

【JDK1.6】

1.Desktop类和SystemTray类
2.使用JAXB2来实现对象与XML之间的映射
3.理解StAX
4.使用Compiler API
5.轻量级Http Server API
6.插入式注解处理API(Pluggable Annotation Processing API)
7.用Console开发控制台程序
8.对脚本语言的支持如: ruby, groovy, javascript.
9.Common Annotations

【JDK1.7】

1.对Java集合(Collections)的增强支持
2.在Switch中可用String
3.数值可加下划线
4.支持二进制文字
5.简化了可变参数方法的调用

【JDK1.8】

1.接口的默认方法
2.Lambda 表达式
3.函数式接口
4.方法与构造函数引用
5.Lambda 作用域
6.访问局部变量
7.访问对象字段与静态变量
8.访问接口的默认方法
9.Date API
10.Annotation 注解

猜你喜欢

转载自shxin.iteye.com/blog/2207809
今日推荐