内容目录:

JAVA 虚拟机深入研究(一)——关于Java的一些历史

JAVA 虚拟机深入研究(二)——JVM虚拟机发展以及一些Java的新东西

这是第二篇,我们来说说有关虚拟机的发展。

一说到虚拟机,很多人潜意识就把它跟Sun的HotSpot虚拟机划上等号,也许有些人还会想到BEA 的JRockit或者IBM 的J9,但是事实上JVM并不只有这些。

从最早的Sun在1996年发布的JDK1.0中包含的Sun Classic VM到今天,曾经出现过很多虚拟机,也跪了很多虚拟机。

  • Sun Classic/ Exact VM

这款虚拟机属于那种已经跪了的品种,但是虽然它跪了,但是依然要记住,因为它是世界上第一款商用Java虚拟机。

96年发行JDK1.0的时候这个虚拟机就是标准配置,但是它只能使用纯粹的解释器方式运行,如果想要使用JIT编译器,就必须外挂。如果外挂了JIT,那么JIT就完全接管虚拟机的执行系统,解释器也就不再工作了(其他的外挂编译器还有  Symantec JIT 和 shuJIT等),这意味着,如果要用编译器执行,那么编译器就不得不对所有的方法,每一行代码都进行编译,尽管其中的一部分并没有编译的价值.迫于程序响应时间的压力,没有程序敢于应用那些编译比较耗时的优化技术,因此这个时候得虚拟机即使用了JIT编译器输出了本地代码,执行效率依然和传统的C/C++有很大的差距,“Java很慢”的印象就是这个时候出现的。

Sun为了解决这个问题,曾经发布了一个名叫Exact VM的虚拟机,它已经初步具备了现代高性能虚拟机的雏形,比如两级即时编译,编译器解释器混合工作的模式。这个编译器采用了准确是内存管理,也就说虚拟机知道内存中某个未知的数据具体是什么类型的,这样在GC(垃圾回收)的时候,虚拟机就可以准确的判断堆上面的数据是否还可以使用。相比于Classic VM的handler 对象查找方式来说,由于使用了准确内存管理,在GC的时候Exact VM不需要去做那一次间接性查找,也就省下了这部分的开销,自然效率高了很多。

虽然这个Exact VM的性能和先进性都比Classic VM高很多,但是在商业上只存在了很短暂的时间就被更加牛逼的HotSpot VM给取代了,甚至都没有来得及发出Windows和Linux平台的版本,我想它也是醉了。

相比之下Classic VM生命力却强了很多,JDK1.2之前Sun的JDK中只有这货一个,JDK1.2的时候这货和HotSpot VM共存,它是默认的,JDK1.3 时HotSpot被作为默认的虚拟机,Classic VM依然存在存在,知道JDK1.4的时候Classic VM才真正的完全退出虚拟机的舞台。

  • Sun HotSpot VM

提到这个虚拟机,很多人都很兴奋,因为它是Sun JDK 和Open JDK中所带的虚拟机,也是目前为止使用最为广泛的虚拟机之一,事实上这个虚拟机不是Sun研发的,而是一个叫做LongView Technologies 的小公司搞出来的,最初的时候甚至都不是为了Java而开发的,它源于Strongtalk VM,这个虚拟机用到的技术来自于一个支持Self语言的以达到C语言50%以上的执行效率为目标的虚拟机设计,Sun看上了人家的JIT编译的很多牛逼的理念和实际效果,于是在97年受够了这家公司,拿到了HotSpot Vm。

HotSpot除了继承了之前的两款虚拟机的优点以外,另外,正如它的名字一样,它的热点探测能力就是它所具有的特性,所谓热点探测就是指,通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法调用的非常频繁,或方法中有许多有效循环,将会分别触发标准编译和OSR(栈上替换)编译动作(所谓栈上替换就是指,在方法执行过程中进行编译,针对频繁调用的方法体和有效循环)。

  • Sun Mobile-Embedded VM /Meta-Circular VM

Sun 公司除了研制了前面的那些服务器和桌面领域的商业虚拟机以外还搞了一些其他领域的或者是作为标准的,甚至根本就是研究或者验证用的,这一部分包括像KVM,CDC/CLDC HotSpot Implementation,Squawk VM,JavaInJava,Maxine VM 等,其中我要说说JavaInJava,它试图以Java语言来实现JAVA运行环境,即所谓的“元循环”(Meta-Circular,指语言用语言自身来实现其运行环境)。

  • BEA JRockit /IBM J9 VM

前面说的都是Sun的,其他的几个我就一笔带过算了,其中要说说JRoctit,号称最快的虚拟机,貌似J9  也这么说,不过呢,它作为专门为服务器开发的虚拟机因为不在乎启动速度所以它的内部不包含解析器的实现,全部代码都考即时编译器编译后执行,另外在垃圾回收和mission control服务的实现上JRockit也是领先地位的。

  • Azul VM / BEA Liquid VM

其实上面说的那些所谓商用高性能虚拟机严格的说还不算是高性能,因为真正的高性能是专业定制的,针对硬件环境的,所以这两个才算是严格的高性能虚拟机,具体的就不展开了,有兴趣可以查查。

  • Apache Harmony /Google Android Dalvik VM

这两个货只能叫他们虚拟机,而不能说是JAVA虚拟机,因为他们都包含了自己的虚拟机和Java库,很多人甚至觉得这是会颠覆传统Java体系的两个家伙。其实吧Apache那个也就是没通过TCK认证而已,原因就是那个由法律部门组成的技术公司,没事靠打官司挣钱的家伙(我会说是Oracle么)搞的鬼呗,当然Sun也有一点原因啦,最后导致Apache 愤怒之下退出JCP(真想骂人…..两个老鼠屎),但是吧金子总还是有人欣赏的,Harmony的很多代码奠定了现在的Android SDK的基础,对安卓的发展起到了巨大的作用,然后我们说到安卓,就说到了Dalvik虚拟机啦,这是安卓的平台的核心组成部分,但是它不是一个Java虚拟机,因为它不遵守Java的规范,不能直接执行class文件,使用寄存器架构而不是栈架构,但是呢还是有很多联系的,比如dex可以有class转化来仍然使用java编写代码,可以使用大部分的Java API。

  • Microsoft JVM以及其他虚拟机

关于这部分,我只想呵呵,详细的东西自己查一下吧,我列个表直接结束

  1. Jam VM
  2. cacaovm
  3. SableVM
  4. Kaffe
  5. Jelatine JVM
  6. Nano VM
  7. MRP
  8. Moxie JVM\
  9. Jikes RVM

关于Java未来的一些技术发展方向

  • 模块化

还记得咱之前一篇提到的jigsaw么?他就是为了这个所谓的模块化的东东,结果还不是没结果,推迟到JDK9去了…..。

所谓模块化呀,其实就是就是为了解决逐渐复杂庞大的问题而提出的一种解决途径。字面意义…..模块吗…..需要啥就按装啥就完了~~

  • 混合语言

很多语言都有Java实现的版本,Java完不成的事就借用其他语言来搞,反正最后都是class运行于jvm就得了呗。这些运行在虚拟机上,但是又不是Java的语言我们就称为混合语言咯~~

  • 多核并行

这个概念没啥好说的,多核心CPU啥的导致的必然情况,就提下OpenJDK的一个子项目Sumatra,一个为Java提供使用GPU接口的项目类似于C的CUDA,还有就是像是Hadoop的map/Reduce这种并行运算框架啥的了,再就是ERlang这种天生的并行计算能力语言。

  • 64位的虚拟机

Cpu的架构都64位了,Java自然也要跟上时代,但是很不幸的是,没跟上,虽然很早以前就已经推出了64位的版本,但是Java程序在64位系统上要付出额外的不晓得代价,首先是内存,通常64的要比32的多耗费10%-30%的内存,其次,据有关测试表明,64的虚拟机在各项指标的测试中多数都落后于32的,所以还是暂时老实点先用着32把啊~~~  64的以后会有的~~

转载于:https://www.cnblogs.com/DeanChiong/p/4984666.html

JAVA 虚拟机深入研究(二)——JVM虚拟机发展以及一些Java的新东西相关推荐

  1. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  2. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机...

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

  3. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机||CSDN博文精选...

    作者:黄小斜 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java面试中总是爱考一类问题, ...

  4. java string rt_如何使jvm加载我的java.lang.String而不是rt.jar中的那个

    我认真研究了Java类加载器.现在,我想编写一个与rt.jar中的类之一具有相同的包名称和类名称的类.例如,我自己编写一个java.lang.String类,以及如何打破父级委托模型以使jvm加载我的 ...

  5. java maxpermsize 设多少_JAVA JVM虚拟机选项:Xms Xmx PermSize MaxPermSize 区别

    Xms : 是指设定程序启动时占用内存大小.一般该值设置大的会使程序启动快,但是可能会使本机暂时变慢. Xmx : 是指设定程序运行期间最大可占用的内存大小,如果程序运行需要占用更多的内存,超出这个 ...

  6. jvm虚拟机组成部分讲解、jvm虚拟机参数使用讲解并发编程框架篇

    JVM系列三:JVM参数设置.分析 https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html public class Test ...

  7. 【Java学习笔记之二十五】初步认知Java内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在 ...

  8. 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等

    1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...

  9. java的JVM虚拟机相关知识,简单易懂。

    一.    Java class执行方式 1)  概要 Java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次 ...

最新文章

  1. VLC搭建RTSP服务器的过程 -测试通过
  2. 交换两个数不引入第三个变量
  3. 处理数字_5_非NULL值的列的个数
  4. 日行千里,全凭“车”况,为什么我们要升级平台
  5. ICCV 2019 Oral 端到端任意形状场景文字识别
  6. 私有CA的创建和证书的申请
  7. 以两种异步模型应用案例,深度解析Future接口
  8. Kubernetes 学习总结(20)—— Kubernetes 与微服务和容器之间是什么关系?
  9. webloigc12服务启动不了_weblogic启动不能锁定AdminServer.lok的故障处理
  10. flex 发送到java_(转)java与flex通信
  11. 转:java 全角半角转换函数
  12. idea运行项目提示找不到或无法加载主类
  13. hmcl启动器java下载_我的世界hmcl启动器
  14. 2010年06期《程序员》配套源码及相关链接
  15. python绘制中国地图散点图_使用Python实现画一个中国地图
  16. springboot 多topic 动态配置
  17. 护士人文修养测试题答案
  18. 解决导入maven工程时cannot resolve依赖问题
  19. 带你走进缓存世界(1):漫谈缓存
  20. Win10桌面图标无法拖动

热门文章

  1. MySQL 5.7.17安装使用以及修改密码方式
  2. Webug4.0 越权修改密码
  3. python批量图片转pdf_批量将多个图片转PDF的记录
  4. 【嵌入式】_ARM DS-5.26.0_(安装破解、编译、运行Helloworld)
  5. 华为AP4050DN-HD使用tftp、uboot瘦转胖
  6. 工具 · 移动端调试工具:weinre
  7. QNAP文件传输服务器,如何通过 DLNA/UPnP 欣赏存储在 QNAP NAS 上的多媒体内容?
  8. python测试脚本 进制转换器_进制转换(用Python实现进制转换器)
  9. JS实例、静态的属性和方法
  10. Vue入门-------(1)