JVM简介

来源:互联网 发布:岩泉一数据 编辑:程序博客网 时间:2024/06/04 18:31

引言:学习Java语言的工程师,都不可避免会碰到JVM这个名词,虽然在开发中使用不多,但是了解起功能和底层的功能原理,对于大家更深入的掌握Java还是非常有帮助的,这里讲对JVM做一个简要的综述。

1.  什么是JVM?

     JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Write once, run anywhere)的平台基础,由JVM帮工程师屏蔽了不同平台的差异性,提供了一致的编写接口。

   谈到JVM,我们不得不讨论一下什么是VM(Virtual Machine),我们在工作中碰到的虚拟由VMWare, Xen, Virtual Box等提供的虚拟机解决方案,还有OpenStack的云解决方案,本质上它们都是虚拟机的技术路线,基于软件来模拟计算机硬件的指令集合,包括网卡,CPU,硬盘存储,IO设备,内存设备等等,从基于目前的软件方案充分发掘硬件设备的利用率和效能,在一台物理机器上做出若干台貌似完全的独立虚拟机器,以至于云平台出来。

   JVM本身是一套软件程序,模拟ava Class规范的字节码指令集合,从而可以进行class的加载以及执行。

2.  JVM的演变历史(这里的JDK主要描述JVM的功能)

  •   1996年, JDK 1.0 classic VM, 纯解释执行,基于外挂进行JIT,落下了Java执行慢的坏名声
  •   1997 年   JDK 1.1  支持AWT、内部类、JDBC、RMI、反射
  •   1998年, JDK 1.2 , JIT混合解释器,精确内存管理,GC性能提升
  •   2000年,JDK 1.3 Hotspot虚拟机登场, JVM的一个里程碑
  •   2002年,JDK 1.4, 一个应用非常广泛的版本,  支持NIO  IPV6 日志API  加密类
  •   2004年, JDK 1.5/JDK 5,支持泛型注解装箱枚举可变长的参数Foreach循环
  •   2006年4月,JDK 6, 支持脚本语言支持JDBC 4.0Java编译器 API,允许基于程序来动态编译代码,加入对动态语言的初步支持
  •  2011年7月, JDK 7, 动态语言增强支持,NIO 2, G1垃圾回收算法的引入,提升JVM大型应用的支持
  •  2014年3月, JDK 8, Lambda表达式语法增强  Java类型注解
  •  2016年预计, JDK 9, 模块化支持等

     总结来说, 前期JDK的升级速度是飞快的,在Java逐渐占领市场之后,引入JCP慢慢得升级变得更为谨慎和周期延长;新特性不停的加入,语言本身变得愈加复杂,JVM性能日渐提升,特别是G1回收算法的引入。在JDK 8之后,逐步引入了动态语言的若干特性,跟风之嫌非常明显,对于Java体现来说不知是好是坏....

3.  我们曾经见过的JDK

     第一个当然是大名鼎鼎的Sun JDK, 应用最广,属于主流平台,后被Oracle收购之后,变成了Oracle JDK.

     第二个是BEA的JRocket JDK, 相对于同时代的Sun JDK而言,性能精良卓越,由于Sun JDK。后被Oracle收购,与Sun JDK合并,消失。

     第三个IBM的JDK, 主要用于IBM的Webspere应用服务器,非开源的,应用不多,在应用服务器大火的时代,随WebSphere而盛名大噪,而随着集群技术的日渐成熟,逐渐消失。

     第四个是Apache的Harmony, 在Apache退出JCP之后,自行开放了一个JDK,后退出市场。

     第五个是Open JDK,其实只是Sun JDK的开源版本,后被Oracle接收,作为JDK中新技术的试验田,逐步融合进入Oracle JDK。

4.  Java语言规范和JVM规范

    Java语言规范是描述Java语言本身的 大纲,包括语法,词法,数据类型以及文法。 JVM规范是描述Class文件格式,JVM执行流程和指令集的。 Java语言编写的代码编译成Java Class文件格式,从而被JVM来执行,这个是两者之间的耦合点。

     但是JVM是一个平台,不仅仅支持Java语言,目前其支持众多的新型语言: Groovy, Scala(Spark的编写语言),Cloure, JPython, JRuby等,只要是编译出来的class遵守JVM的规范,即可被JVM解释执行;这个也是JVM作为一个平台,与Java语言独立发展的源动力,随着后续JVM性能的提升以及平台稳定,也给不同的新语言提供了运行平台,从而导致了百花齐放般的JVM 语言出现。

    JVM的数据类型与Java语言规范中的数据类型并不一致,其中很多的数据类型更侧重于底层字节和数据的解释执行。

    JVM中有堆(Java Object分配空间),栈(线程执行区域),方法区, PC(Program Counter)程序计数器等组成,除了上面提到了指令集合,加载顺序以及解释执行顺序等。

5. JVM还有什么额外功能

  •     反射 java.lang.reflect
  •     ClassLoader (与Java语言中的Class Loader不同,其为最底层的加载器,基于c语言来实现的dll链接库,非Java语言实现)
  •     初始化class和interface
  •     安全相关 java.security
  •     多线程
  •     弱引用

6.  总结

    JVM是独立于Java语言的一套规范以及一个Class解释执行的平台软件,以其性能精良、稳定高效,赢得了大型应用的亲睐,我们讲逐步深入其中了解更多的JVM内容。

3. 

0 0