设为首页 收藏本站
查看: 911|回复: 0

[经验分享] 探秘JVM(一)——JVM的前世今生

[复制链接]

尚未签到

发表于 2017-6-24 22:10:39 | 显示全部楼层 |阅读模式
  缘起Java
  说起大名鼎鼎的Java语言,可有说不尽的黑历史。它的诞生是Sun公司的Green团队为了让世界上所有的电子设备更加智能,开发一种全新的嵌入式的系统。它的目的是为了解决c++语言复杂庞大的缺点,以及实现跨平台,然而想要在当时统一不同的硬件平台谈何容易(受限于各种厂商的利益关系),于是乎这个项目就耽搁了。
  在早期因特网大获成功后,业界兴起了开发动态网页的大潮,而刚好oak语言具有轻量、简单的特性,非常适合在互联网中传播,于是Sun开始重拾oak项目,紧接着Sun就推出来了Applet。Applet是一种采用Java编程的内嵌在HTML中的小程序,可以把它类比为当今火热的JavaScript在网页中的作用。在1995年5月23日,Suns在SunWorld大会中正式推出Java和HotJava浏览器,同时提出了那句著名的口号“Write Once,Run Anywhere”。
  随后Java迎来了井喷式的发展,包括IBM、Apple、Adobe、HP、Oracle、Netscape、微软在内的软件行业巨头纷纷购买了Java的使用许可,开始为自己的产品开发相应的Java平台。主流的操作系统也宣布将嵌入Java技术,大量网页浏览器应用Java技术来制作。也正是这些意料之外的成功,在96年1月,Sun发布了第一个开发工具包JDK1.0,这也标志着Java成为独立的开发工具。
  Java大事件

  • 1995年5月23日,Java语言诞生
  • 1996年1月,第一个JDK-JDK1.0诞生
  • 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
  • 1996年9月,约8.3万个网页应用了JAVA技术来制作
  • 1997年2月18日,JDK1.1发布
  • 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
  • 1997年9月,JavaDeveloperConnection社区成员超过十万
  • 1998年2月,JDK1.1被下载超过2,000,000
  • 1998年12月8日,JAVA2企业平台J2EE发布
  • 1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
  • 2000年5月8日,JDK1.3发布
  • 2000年5月29日,JDK1.4发布
  • 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
  • 2001年9月24日,J2EE1.3发布
  • 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
  • 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
  • 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
  • 2006年12月,SUN公司发布JRE6.0
  • 2009年12月,SUN公司发布Java EE 6
  • 2010年11月,由于Oracle公司对于Java社区的不友善,因此Apache扬言将退出JCP[14]
  • 2011年7月28日,Oracle公司发布Java SE 7
  • 2014年3月18日,Oracle公司发表Java SE 8
  Data From Wikipidea link:https://zh.wikipedia.org/wiki/Java
  JVM的大乱斗
  JVM的发展经历了从无到有、百家争鸣、一家独大的三个过程。Java能够成为最受欢迎的语言之一,JVM的不断壮大功不可没。
  1、Sun Classic VM(从无到有)
    这个算是第一款商用的JVM,从JDK 1.1到1.2时代用的就是这款虚拟机,纯解释器形式,如果想要使用JIT(Just In Time Compiler)编译器必须外挂,并且此时JIT编译器便完全接管了虚拟机的活。但是大家都知道JIT编译器是实时编译字节码(.class里的东西),并且JIT会把翻译过的机器码保存起来,因此如果你的代码复用性和使用率很高,使用JIT会加快代码的执行速度(相对于解释器)。但是如果你的代码中有大量的低频代码,那么编译后真正被执行的代码部分很少,此时JIT的效率就很差了(相对于解释器逐行翻译成执行来说)。Classic VM虚拟机太过极端,只能二选一,因此速度肯定快不到哪里去,比起C/C++更是有很大的差距。这也注定Classic VM很快将被淘汰。
  这里需要说明一下在JVM中有三类编译器,以后将编译器的时候在详细展开:
  1)前端编译器:把*.java文件转变为*.class文件,典型的有Javac、ECJ等。
  2)后端编译器(JIT编译器):把字节码转化为机器码的编译器,典型的有HotSpot VM中的C1、C2编译器等。
  3)静态提前(AOT)编译器:把*.java直接转化成本地机器码的编译器,比如GCJ、Excelsior JET。
  2、Sun Hotspot VM
    Hotspot这个虚拟机对于每一个Java程序员来说都不应该陌生,OpenJDK中使用的便是这种虚拟机,同时它也是目前使用范围最广的虚拟机。但其实Hotspot的前身是Longview公司为Self语言打造的,性能优异,据说有50%C语言的执行效率。原因是其JIT编译有许多优异的理念。正是Sun看中了这个技术收购了Longview公司,同时获得了HotSpot VM的技术。HotSpot正如起名字所示,就是能够探测热点代码,原理是通过执行计数器的方式,然后通知JIT编译器对该代码以方法为单位进行编译。低频代码用解释器执行,高频代码以编译后的机器码执行(并且以方法为最小单位),这种方式结合了解释器和编译器的优点,性能上来说也得到了一定的提升。2006年的时候Sun公司把Java开源,第二年也陆续将JDK的各部分进行了开源,其中就包括HotSpot VM。

  3、Sun Moblie-Embedded VM/Meta-Circular VM
  Sun公司不光在桌面应用和服务端有野心,同时也把目光放到了移动和嵌入式领域。
  1)KVM
    KVM可能大家不是很熟悉,因为前几年它已经被淘汰了。但是说起曾经非智能手机和部分智能手机中的Java应用,其实都是跑在这个虚拟机上的。他也是博主对Java的第一印象,直到上了大学才知道Java如此强大,以前一直以为只是一个手机应用平台(捂脸)。。不过话说回来本身较差的代码执行速度加上低性能的手机,这种技术下的应用的体验自然好不到哪去。加上后来智能手机的崛起,KVM的没落也是情理之中。
  2)CDC/CLDC HotSpot Implementation
    CDC/CLDC是整个Java ME概念的支柱技术,他希望在手机、电子书、PDA等移动设备上建立统一的Java接口。下场参考KVM。
  3)Squawk 4)JavaInJava 5)maxine VM 等影响较小就不展开了。
  4、BEA JRockit/IBM J9
    BEA和IBM应该是为数不多的拥有优秀自主的JVM厂商了。BEA旗下最著名产品的就是JRockit VM了,当时号称最快虚拟机,特点是没有解释器,纯即时编译后执行。原因是这款虚拟机是服务器“特供”,JIT编译有一个缺点就是应用启动特别慢(相对于解释器执行来说编译时间长),但是由于是在服务器的情况下,启动慢并没有多大关系,所以这种完全抛弃解释器的JVM性能也是杠杠的。
    J9的名头同样很大,作为IBM的独立研发的主力JVM,从定位上来说和HotSpot比较接近,应用从服务器到桌面、嵌入式系统都有涉及。被使用的对象也是IBM自家的产品。比如IBM WebSphere等。
  5、Apache Harmony
    这款虚拟机的命运就比较悲惨了,Harmony VM并不能被称为Java虚拟机,因为虽然它能够让基于jdk 1.5\1.6的应用在其上运行,但是由于没有通过TCK完全认证(只通过Java SE认证,Sun 对于其他厂商出品的Java兼容平台需要通过TCK认证) ,直到Oracle收购Sun后,Apache愤然退出JCP组织。
    这其中一个十分关键的原因是Harmony VM率先将JVM进行了模块化设计,从设计思路上来说是这种模式十分先进的。但是对于Sun来说,这必将导致Java社区的分裂,出此下策也是无奈之举。如今Oracle也将在最新的Java中运用模块化的设计,真是让人对当年的Harmony感到可惜。
  6、Google Android Dalvik VM
    Android Dalvik VM的知名度应该完全不亚于HotSpot VM,虽然Android是使用Java编写的,但是 Dalvik VM和普通版JVM大不相同。。Dalvik 并没有遵循JVM标准,他最终生成的可执行文件也不是jar文件,而是dex文件。实际上Dalvik对前端编译器生成的class文件重新做了一次重构,大大提高了Android程序的运行速度。其次JVM是基于栈的架构,而Dalvik VM是基于寄存器的架构。基于栈的机器必须使用指令来载入栈上的数据,相对于基于寄存器架构来说,指令数量会多很多。然而,在寄存器的指令必须编码源和目的地寄存器,因此往往指令更大。
    其中分发指令这个环节对性能的影响最大。在基于寄存器的Dalvik VM中,可以更有效的减少冗余指令的分发,减少内存的读写访问。 从JVM和Dalvik VM的区别上来说,Dalvik VM主要是针对Android这个嵌入式操作系统的特点进行了各种优化,使其更省电、更省内存、运行效率更高,但是牺牲了一些JVM的与平台无关的特性。实际上,Dalvik VM本就是为Android设计的,无需考虑其它平台的问题。
  总结:
    JVM的科技树有开了许多分叉,不同类型的JVM针对不同的硬件、操作系统环境都会有不同的特点。而java字节码的执行、编译方式的组合与优化是它们间差异化的根本原因。接下来马上进入到JVM的编译世界。
  
    

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-387710-1-1.html 上篇帖子: 虚拟机参数调整 下篇帖子: Linux kernel Vhost-net 和 Virtio-net代码详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表