JVM必知必会 - Java虚拟机概述

目录

 

序言

正文

JVM的整体结构

JVM的历史

Java代码执行流程


序言

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

 

正文


JVM的整体结构

 

JVM也就是Java虚拟机大致可以分为三层

 

上层是类加载器子系统, 中层为运行时数据区,下层为执行引擎.  

  • 类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。
  • 运行时数据区,Runtime Data Area,用于保存java程序运行过程中需要用到的数据和相关信息;经常说的把数据读到内存,包括类加载之后的信息,从磁盘读取文件信息等。
  • 行引擎是Java虚拟机核心的组成部分之一,如果想要让一个Java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。

 

通过这三层的结构体系构成了我们Java虚拟机的整个运行流程,当然实际的操作远比描述的更为复杂.

 

JVM必知必会 - Java虚拟机概述

 

 

JVM的历史

 

Sun Classic VM

  • 在1996年java1.0版本的时候发布,也是世界上第一款商用Java虚拟机,JDK1.4的时候被完全淘汰
  • 这款虚拟机内部只提供解释器
  • 如果会用JIT编译器就需要外挂,并且和解释器不能协同工作

在虚拟机内部的执行引擎又存在了解释器和JIT即时编译器,在最早的Sun Classic VM中当时只存在解释器还没有并入JIT即时编译器

 

Exact VM

  • 为了解决上一个虚拟机问题,jdk1.2时提供此虚拟机
  • 虚拟机可以知道内存某个位置的数据具体是什么类型,比如说这块内存是一串数值还是一串地址值
  • 编译器与解释器混合工作模式
  • 只在Soaris平台短暂使用,很快被HotSpot虚拟机替换

 

HotSpot VM

  • 最初是由一家名为"LongView Technologies" 的小公司设计
  • 1997年,此公司被SUN收购,2009年,SUN公司被甲骨文收购
  • JDK1.3时,HotSpot VM成为默认虚拟机

 

JRockit

  • 专注于服务器端应用,它可以不太关注程序的启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行;
  • 大量的行业基准测试显示,JRockit JVM是世界上最快的JVM。
  • 使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了70%)和硬件成本的减少(达50%);
  • JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要;
  • MissionControl服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具;
  • 2008,BEA被Oracle收购。
  • Oracle表达了整合两大优秀虚拟机的工作,大致在JDK8中完成。整合的方式是在HotSpot的基础上,移植JRockit的优秀特性;

 

J9 JVM

  • 全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9
  • 市场定位于HotSpot接近,服务器端、桌面应用、嵌入式等多用途JVM;
  • 广泛用于IBM的各种Java产品;
  • 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的Java虚拟机(在IBM自己的产品上稳定);
  • 2017年左右,IBM发布了开源J9 VM,命名OpenJ9,交给Eclipse基金会管理,也称为Eclipse OpenJ9

 

 KVM和CDC/CLDC HotSpot

  • Oracle在Java ME产品上的两款虚拟机为:CDC/CLDC HotSpot Implmentation VM;

  • KVM(Kilobyte)是CLDC-HI早期产品

  • 目前移动领域地位尴尬,智能手机被Android和IOS二分天下;

  • KVM简单、轻量、高度可移植,面向更低端的设备上还维持自己的一片市场

  • 所有的虚拟机原则:一次编译,到处运行;

 

Azul

  • 前面三大“高性能Java虚拟机”使用在通用硬件平台上;

  • 这里Azul VM和BEA Liquid VM是与特定硬件平台绑定、软硬件配合的专有虚拟机

  • 高性能Java虚拟机中的战斗机;
  • Azul VM是Azul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机。

  • 每个Azul VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、专有硬件优化的线程调度等优秀特性。

  • 2010年,Azul Systems公司开始从硬件转向软件,发布了自己的Zing JVM,可以在通用X86平台上提供接近于Vega系统的特性;

Apache Harmony

  • Apache也曾推出过于JDK1.5和JDK1.6兼容的Java运行平台Apache Harmony;
  • 它是IBM和Intel联合开发的开源JVM,受到同样开源的OpenJDK的压制,SUN坚决不让Harmony获得JCP认证,最终于2011年退役,IBM转而参与OpenJDK;
  • 虽然目前并没有Apache Harmony被大规模商用的案例,但是它的Java类库代码吸纳进了Android SDK;

 

Microsoft JVM

  • 微软为了在IE3浏览器中支持JAVA Applets,开发了Microsoft JVM;
  • 只能在Windows平台下运行。但却是当时windows下性能最好的Java JVM;
  • 1997年,Sun以侵犯商标、不正当竞争罪名指控微软成功,赔了Sun很多钱,微软在WindowsXP SP3中抹掉了其JVM。现在windows上安装的jdk都是HotSpot。

 

Taobao JVM

  • 由AliJVM 团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。

  • 基于OpenJDK 开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里JAVA体系的基石;

  • 基于OpenJDK HotSpot JVM发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机

  • taobao JVM应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能;

 

Graal VM

  • 2018年4月 Oracle Labs公开了Graal VM,号称“Run Programs Faster Anywhere”,勃勃野心。与1995年java的“write once, run anywhere”遥相呼应;
  • Graal vm在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。语言包括:java、Scala、Groovy、Kotlin、C、C++、JavaScript、Ruby、Python、R等;
  • 支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件;
  • 工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建而向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率;
  • 如果说HotSpot有一天真的被取代,Graal VM希望最大。但是Java的软件生态没有丝毫变化;

 

Java代码执行流程

 

首先编写.java文件,然后通过java编译器javac(前端编译器)生成出.class文件,.class文件通过类加载器子系统被加载到内存中(运行时数据区),最后通过执行引擎的解释器和JIT即时编译器将字节码翻译为机器识别的机器指令.

JVM必知必会 - Java虚拟机概述