Java虚拟机发展简介,java虚拟机简介
Java虚拟机发展简介,java虚拟机简介
说明
Java不仅仅是一门变成语言,还是一个由一些雷恩计算机软件和规约形成的技术体系,这个技术体系提供了完成的用于软件开发和快平台部署的支持环境。现阶段也被广泛应用与嵌入式系统、移动终端、企业服务器、大型机等各种场景。
Java技术体系
写到Java技术体系,先解释几个专有名词。
- JDK(Java Development Kit)是Java程序设计语言,Java虚拟机,Java API类库的统称。
- JRE(Java Runtime Environment)是指支持Java程序运行的标准环境,包括Java API类库中的Java SE API子集和Java虚拟机这两个部门。
也就是说JDK包含了JRE。
下面解释一下Java技术体系的四大平台:
- Java Card:指支持一些Java小程序(applets)运行在小内存设备的平台,例如智能卡。
- Java ME(Micro Edition):支持Java程序运行在移动终端平台,如智能手机。
- Java SE(Standard Edition):支持面向桌面级应用的Java平台,如windows下的应用。
- Java EE(Enterprise Edition):支持使用多层架构的企业应用,如ERP,CRM应用。
三大商业虚拟机
JRockit、HotSpot、IBM J9
在介绍三大虚拟机的时候,需要先介绍几个概念,
1、动态编译(dynamic compilation)指的是“在运行时进行编译”。
2、静态编译(static compilation)指的是事前编译(即AOT)。
3、JIT编译(just-in-time compilation)狭义上就是指某段代码即将第一次被执行的时候进行编译,因此也叫“即时编译”,说明JIT编译是动态编译中的一个特例。
4、自适应动态编译(adaptive dynamic compilation)也是一种动态编译的方式,不同的是该种方式在编译的时候比JIT时间节点更迟一些。自适应动态编译实现让程序一某种方式先运行起来,在收集到一些信息之后再进行动态编译。
5、解释器与编译器其中解释器可以理解成一边编译一边执行。具体理解可以参考
在这里需要解释一下现在业界对于java的评价:“java语言很慢” 的观点。
在1996年Sun公司在发布JDK1.0版本的时候,Java语言首次拥有了商用的正式运行环境,这个JDK中所带的虚拟机就是Classic VM,该款虚拟机只能使用纯解释器的方式来执行Java代码,如果要使用JIT编译器,就必须使用外挂,在使用外挂编译器的时候,外挂编译器就会完全接管虚拟机的执行系统,也就是说解释器就不在工作了。
在早期的虚拟机中解释器与编译器不能配置工作(如上述的Classic VM),这样也就意味着如果使用编译器执行,编译器就不得不对每一个方法、每一行代码都进行编译,不关心这些代码的执行频率是否具有编译的意义。同时,基于程序的响应时间的压力(启动速度),这些编译器根本不敢应用编译耗时稍高的优化技术,因此在这个阶段的虚拟机即使使用了JIT编译器输出本地代码,但是执行效率也和传统的C/C++程序有较大的差距,“java语言很慢”这个观点也是在这个时期在开发人员心中广为流传。
需要说明的是:在JDK1.2时期出现的Exact VM虚拟机,该虚拟机的执行系统已经具备了现在高性能虚拟机的雏形,如两级即时编译器、编译器与解释器混合工作得模式。但值得一提的是虽然Exact VM虚拟机相对于Classic VM在性能了有了很大的改进,很优秀。但最终还是被当时的另外一款虚拟机打败了(内置到了JDK1.2中),这款更加优秀的虚拟就即使现在大家常见的Hotspot VM。通过执行java -version可以看到,在JDK1.3时已经将HotSpot VM作为了默认的虚拟机。
在部分商用虚拟机中(如HotSpot),Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler)。
即时编译器并不是虚拟机必须的部分,Java虚拟机规范并没有规定Java虚拟机内必须要有即时编译器存在,更没有限定或指导即时编译器应该如何去实现。但是,即时编译器编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标之一,它也是虚拟机中最核心且最能体现虚拟机技术水平的部分。
总结
目前JDK中默认的虚拟机HotSpot VM 使用但是解释器与编译器并存的架构模式,解释器和编译器两个各有优势,
解释器的执行阶段顺序为:输入的代码 -> [ 解释器 解释执行 ] -> 执行结果
编译器执行的阶段顺序为:输入的代码 -> [ 编译器 编译 ] -> 编译后的代码 -> [ 执行 ] -> 执行结果
对比以上两种执行顺序,则程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序运行环境中内存资源限制较大(如部分嵌入式系统中),可以使用解释器执行节约内存,反之可以使用编译执行来提升效率。此外,如果编译后出现“罕见陷阱”,可以通过逆优化(解释器与编译器并存的架构优势)退回到解释执行。
在此推荐两篇博客:
https://blog.csdn.net/sunxianghuang/article/details/52094859
https://blog.csdn.net/touzani/article/details/1625760
相关文章
- 暂无相关文章
用户点评