【三】Java VM 发展史
1. Sun Classic VM
jdk1.0 第一款商用虚拟机。
只能使用纯解释器来运行Java代码。没有自己的判断,会把每一个方法每一行代码都编译,效率不好。导致大家普遍认为Java代码运行效率比较慢。
使用jit编译器的话 需要外挂完全接管虚拟机的执行系统,解释器不再工作。 (Why use jit ?)
2. Exact VM
jdk1.2 只在Solaris上发布了
Exact Memory Management 准确式子内存管理
即:虚拟机可以知道内存中某个位置的数据具体是什么类型的。
eg:一个整数类型数据,到底是引用类型的数值地址呢?还是直接存了这个数值的整数?知道这个之后,进行垃圾回收的时候,就可以判断堆上的数据是否还能被使用
可以抛弃classic VM 基于handler的查找方式,那么虚拟机的性能较classic VM有一个很大的提高。有了高性能虚拟机的雏形。编译器和解释器混合工作以及两
级即时编译器。
英雄气短,还没来得及在windows和linux上发布,就被Hot Spot取代了。jdk1.2 在windows 和linux 上依然是classicVM
3.Hot Spot VM
参考:《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》
http://book.2cto.com/201306/25426.html
提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的;
甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM,
而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机,
Sun公司注意到了这款虚拟机在JIT编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。 HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势,
如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC,
而Exact VM之中也有与HotSpot几乎一样的热点探测。
为了Exact VM和HotSpot VM哪个成为Sun主要支持的VM产品,在Sun公司内部还有过争论,HotSpot打败Exact并不能算技术上的胜利),
HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。
如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。
通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,
即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。 在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码,
并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。 在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。
Oracle公司宣布在不久的将来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工作,使之优势互补。
整合的方式大致上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务,
使用HotSpot的JIT编译器与混合的运行时系统。
4.KVM
- kilobyte 简单、轻量、高度可移植、运行速度慢,是一款嵌入式虚拟机。 (j2ME使用)
- 在手机平台运行
5、JRockit
- BEA 公司研发 (BEA公司 2008年被Oracle收购)
- 世界上最快的虚拟机
- 专注服务器端的应用(不太关心程序的启动速度,内部不包含解释器的实现,全部代码都靠即时编译器编译后执行,所以性能高)
- 优势:
- 垃圾收集器
- Mission Controle服务套件(用来诊断内存泄露并指出根本原因)
6、J9
IBM Technology for java virtual Machine (IT4j)
与Hot Spot 类似,从服务器端,到桌面应用,再到嵌入式,全部都考虑了,
7、Dalvik (安卓)
是冰岛的一个小渔村的名字。
并不是一个Java虚拟机,因为并不遵循Java虚拟机的规范,是不能直接执行编译后的.class文件。
使用的是寄存器架构,而不是Java VM 所使用的栈架构。它执行的是 .dex(dalvik Execuable)文件。
8、Microsoft JVM
只能运行在windows 平台上,当时是windows上运行效率最快的。
97 Sun 以此告微软,微软败诉,赔偿大概10亿美元作用。并停止开发和使用此虚拟机,就此夭折。所以现在windows 系统上并没有自带的虚拟机,都需要自己安装并配置环境变量。
9、Azul VM
是Azul system 公司 在Hot Spot基础上进行的改进,是运行在其公司专有的硬件上,一个Azul VM 实例,都可以管理数十个CPU以及数百G的内存资源,而且通过巨大内存范围内,实现可控的GC事件以及垃圾回收。
10、 Liquid VM
BEA 公司的一个产品。更加强大,不需要操作系统的支持,它自己就是一个操作系统。说Java慢,是因为它先经过一层Java VM,然后虚拟机来调用OS,多了一部。而Liquid VM本身就不需要OS的支持,它自己就已经实现了File System,网络支持等等这些必要的功能,本身就相当与一个OS。所以性能和速度都是相当强大的。
11、TaobaoVM
淘宝公司根据HotSpot 深度定制的产品。对硬件依赖比较高,eg : 只能使用Intel的CPU,损失了兼容性,但是提高了性能。在JNI(Java Native Interface)调用时,能够降低进程的开销。
【三】Java VM 发展史的更多相关文章
- 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- java vm args
这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问题.在网上一查可能是JAVA的堆栈 ...
- Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
- 《深入理解Java虚拟机》(一)Java虚拟机发展史
Java虚拟机发展史 1.Sun Classic/Exact VM 1.Sun Classic:世界第一款商用Java虚拟机. 2.Exact VM:准确式GC:虚拟机可以知道内存中的某个位置的数据具 ...
- Java EE发展史
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- JavaSE复习~Java语言发展史
Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ...
- JAVA日志发展史
JAVA日志发展史 第一阶段 2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err 缺点: 产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出 输出 ...
随机推荐
- 「ZJOI2016」旅行者 解题报告
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...
- 「SCOI2014」方伯伯的商场之旅 解题报告
「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...
- centos7下利用httpd2.4配置svn并使用Ldap用户认证
应用场景:Windows下有AD活动目录,类Unix系统下有Ldap,在运维开发工具平台逐步丰富的现在,统一用户管理大大便捷了管理人员. 其中不乏经典版本控制管理工具svn,与Ldap组合的用户认证方 ...
- css 圆形头像
方法一:背景图片(推荐) 好处是,图片长宽不等的情况下图片不会变形 .ui-photo { width: 100px; height: 100px; background: url("img ...
- 模拟赛 yjqb
对于这种“不能交叉”的条件,不是很好处理.那么就考虑一下dp dp[i][j]表示,考虑A中用前i个,考虑连接B中用前j个,最大匹配.(类似LCS的DP) 转移:dp[i][j]=max(dp[i][ ...
- 洛谷 P1393 P3157 动态逆序对
嘛,好久没碰CDQ分治了,做道题练练手. 时间倒流——把删数改为加数. 对于每个被删的,我的想法是拆成询问和add,后来发现一个足矣. 我本来准备对每个删的数都求一遍整体逆序对,后来发现无论如何都不可 ...
- Python线程状态和全局解释器锁
在刚接触Python的时候时常听到GIL这个词,并且发现这个词经常和Python无法高效的实现多线程划上等号.本着不光要知其然,还要知其所以然的研究态度,博主搜集了各方面的资料,花了一周内几个小时的闲 ...
- javascript学习笔记二
1.js的string对象 **创建 String对象 *** var str = "abc"; **方法 和 属性(文档) *** 属性 length : 字符串的长度 ***方 ...
- python学习笔记-Day2 Numpy数组
1. 实现两个数组相加,在数据量特别大的时候 产生数组: (1) 从列表产生数组:a=[0,1,2,3] a=np.array(1) a (2) 从列表传入 a=np.array([1,2,3,4 ...
- Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies
传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: Vova有n个奖杯,这n个奖杯全部是金奖或银奖,Vova将所有奖杯排成一排,你 ...