JVM与Java体系结构

目录

一、Java虚拟机整体架构祥图

二、Java代码执行过程详图

三、汇编语言、机器语言、高级语言关系

四、JVM的架构模型

五、JVM的生命周期

(一)虚拟机的启动

(二)虚拟机的执行

(三)虚拟机的退出

六、JVM发展历程

[(一)sun Classic VM](#(一)sun Classic VM)

[(二)Exact VM](#(二)Exact VM)

(三)hotspot虚拟机

(四)JRockit

[(五)IBM J9](#(五)IBM J9)

[(六) Azul VM](#(六) Azul VM)

[(七)Liquid VM](#(七)Liquid VM)

[(八)Apache Harmony](#(八)Apache Harmony)

(九)TaobaoJVM

[(十)Dalvik VM](#(十)Dalvik VM)


一、Java虚拟机整体架构祥图

二、Java代码执行过程详图

三、汇编语言、机器语言、高级语言关系

四、JVM的架构模型

Java的编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构

两种架构的区别:

基于栈式架构:

1、优点

  • 设计和实现简单,适用于资源受限的系统
  • 避开了寄存器的分配难题:使用零地址指令方式分配
  • 指令流中大部分都是零地址指令,其执行过程依赖操作栈,指令集更小,编译器容易实现
    • 8位字节码,所以说指令集更小,但是完成一项操作花费的指令相对多。
  • 不需要硬件支持,可移植性更好,更好实现跨平台

2、缺点

  • 性能下降,实现同样的功能需要更多的指令,毕竟还要入栈出栈等操作

基于寄存器架构:

1、优点

  • 性能优秀,执行更高效
  • 花费更少的指令去完成一项操作

2、缺点

  • 指令集架构完全依赖硬件,可移植性差

3、典型应用是X86的二进制指令集,比如传统的PC以及安卓的Davlik虚拟机(16位字节码)

大部分情况下,指令集往往以一地址指令,二地址指令和三地址指令为主。

为什么说栈式花费的指令多?

我们可以通过javap命令反编译一个文件,查看其计算流程:

javap 查看字节码

  • -v输出附加信息
  • -l输出行号和本地变量表
  • -p显示所有类和成员
  • -c对代码进行反汇编

五、JVM的生命周期

(一)虚拟机的启动

通过引导类加载器bootstrap class loader创建一个初始类来完成的,这个类是由虚拟机的具体实现指定的。

(二)虚拟机的执行

执行一个所谓的Java程序的时候,真正执行的是一个叫Java虚拟机的进程

(三)虚拟机的退出

  • 程序正常执行结束
  • 执行过程遇到异常或错误而异常终止
  • 操作系统错误导致Java虚拟机进程终止
  • Runtime类或System类的exit方法、runtime类的halt方法,并且Java安全管理器允许这次exit或halt操作
    • halt停止、停下、阻止
    • exit方法源码:static native void halt0(int status)
  • JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机退出的情况

六、JVM发展历程

(一)sun Classic VM

  • 世界第一款商用Java虚拟机
  • JDK1.4时被淘汰
  • 只提供了解释器
  • 如果使用JIT编译器,就需要外挂,但是JIT和解释器不能配合工作

(二)Exact VM

  • 为了解决上一个虚拟机问题,JDK1.2时,sun提供了此虚拟机
  • Exact Memory Management:准确式内存管理
    • 虚拟机知道内存中某个位置的数据是什么类型
  • 具有现代高性能虚拟机的雏形
    • 热点探测
    • 编译器与解释器混合工作模式
  • 只在Solaris平台短暂使用,其他平台还是Classic vm
    • 英雄气短,被hotspot虚拟机替换

(三)hotspot虚拟机

  • 最初由Longview Technologies的小公司设计,1997年被sun公司收购,2009年sun公司被甲骨文收购
  • JDK1.3时,HotSpot VM成为默认虚拟机
  • 绝对市场地位,称霸武林
    • JDK6,8等均默认
  • HotSpot就是他的热点代码探测技术
    • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
    • 通过编译器与解释器协同工作,在优化响应时间和最佳执行性能中取得平

(四)JRockit

  • BEA公司
  • 专注服务器端应用
    • 不太关注程序启动速度,引起JRockit内部不包括解析器实现,全部代码靠即时编译器编译后执行
  • 世界上最快的JVM
  • 全面的Java运行时解决方案组合
    • JRockit Real Time提供毫秒或微秒级的JVM响应时间,适合财务、军事指挥,电信网络的需要
    • MissionControl服务套件,极低的开销,来监控、管理和分析生成环境中的应用程序的工具
  • 2008年BEA被oracle收购
  • JDK8中,在HOTSPOT的基础上,移植JRockit的优秀特性

(五)IBM J9

  • 全称:IBM Technology for java Virtual Machine 简称IT4J,内部代号J9
  • 市场定位与HotSpot接近,服务器端、桌面应用,嵌入式等多用途VM
  • 广泛应用于IBM的各种Java产品
    • IBM产品结合使用性能最好
  • 有影响力的三大商用虚拟机之一
  • 2017开源,OPEN J9

(六) Azul VM

  • 与特定硬件平台绑定、软硬件配合的专有虚拟机
  • 运行于Azul Systems公司的专有硬件Vega系统上的虚拟机
  • 每个实例可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器,专有硬件优化的线程调度等优秀特性
  • 2010年,发布自己的Zing JVM,可以在通用X86平台上提供接近于vega系统的特性

(七)Liquid VM

  • BEA公司开发的,运行在自家Hypervisor系统上
  • 不需要操作系统支持,本身实现了一个专用操作系统的必要功能,如线程调度、文件系统、网络支持等
  • 随着JRockit虚拟机终止开发,Liquid VM项目也停止了

(八)Apache Harmony

  • JDK1.5,1.6兼容
  • IBM和Intel联合开发的开源JVM,2011年退役
  • Java类库代码吸纳进了Android SDK

(九)TaobaoJVM

  • 基于OpenJDK开发了自己的定制版本AlibabaJDK
  • 深度定制且开源的高性能服务器版JAVA虚拟机
  • GCIH:GC invisible heap,将生命周期较长的Java对象从heap中已到heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率
  • GCIH中的对象还能够在多个JAVA虚拟机进程中实现共享
  • 使用crc32指令实现JVM intrinsic降低JNI的调用开销
  • 针对大数据场景的ZenGC
  • 在阿里产品上性能高,硬件严重依赖intel的CPU,损失了兼容性,但是提高了性能
  • 淘宝、天猫上线,把oracle官方JVM版本全部替换

(十)Dalvik VM

  • 谷歌开发,应用于Android系统,安卓2.2提供了JIT,发展迅猛
  • 只能称作虚拟机,不能称作Java虚拟机,没有遵循Java虚拟机规范
  • 不能直接执行Java的Class文件
  • 基于寄存器架构,不是jvm的栈架构
  • 执行的是编译后的dex文件,执行效率比较高
  • 安卓5.0使用支持提前编译AOT的ART VM替换Dalvik VM
相关推荐
The_Ticker4 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光27 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长40 分钟前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
ExiFengs44 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj1234567891 小时前
JDK1.8新增特性
java·开发语言
捂月1 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
慧都小妮子1 小时前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
m51271 小时前
LinuxC语言
java·服务器·前端
IU宝1 小时前
C/C++内存管理
java·c语言·c++