Java发展历史
- 到现在为止,javaSE8(1.8.0)仍然是企业中使用的最多的版本
JVM发展历史
- 解释器:提高响应时间,提交代码马上可以执行,执行的慢
- 编译器:提高执行性能,提交代码需要先编译完成,执行的快
- Sun Classic VM
- Exact VM
- Exact Memory Management:虚拟机知道位于内存中的数据的具体类型
- 编译器和解释器协同工作
- 热点探测
- Sun HotSpot VM
- 使用最多的虚拟机
- 编译器(JIT)和解释器协同工作
- JIT(Just In Time)即时编译器会将编译后的热点代码缓存起来
- 热点探测(热点代码为经常被执行的代码)
- 独有方法区,JRockit和J9 VM都没有方法区
- Sun公司被Oracle收购
- BEA JRockit VM
- 快
- 专注服务器应用
- 没有解释器
- 全面的JVM解决方案(提供JRockit Real Time解决方案-微秒响应时间;提供Mission Control服务套件-极低开销监控、管理和分析JVM的工具)
- BEA公司被Oracle收购
- IBM J9 VM
- KVM和CDC/CLDC HotSpot VM
- CDC/CLDC HotSpot VM是Java ME产品线上的两款VM
- KVM是CLDC-HI的早期产品
- KVM面向低端功能机市场
- KVM简单、轻量、高度可移植
- Azul VM
- 软硬件耦合
- 超快:Azul VM与Vega系统结合性能>HotSpot
- Azul Zing VM
- 快:Zing VM 在x86平台性能>HotSpot
- BEA Liquid VM
- 也叫JRockit VE(Virtual Edition)
- 软硬件耦合
- 不需要运行于操作系统之上,自己实现了专用操作系统
- 项目已经终止
- Apache Harmony
- 未大规模商用
- Java类库代码吸纳进了Android SDK
- Microsoft VM
- TaobaoJVM
- GCIH(GC invisible heap,GC不可见的堆):
- GC管理:生命周期长的对象移动到heap外,GC不能管理GCIH内部的Java对象-生命周期长的对象直接不让GC管理了。
- 对象共享:GCIH中的对象可以跨JVM进程共享。
- JNI(Java native interface):
- 降低JNI调用开销
- 使用crc32指令实现JVM intrinsic降低了JNI调用开销
- 诊断监测:
- PMU hardware的Java profiling tool
- ZenGC:
- 软硬件耦合
- CPU全都是清一色的Intel CPU,且编译手段采用的是Intel C/CPP Compiler进行编译
- Dalvik VM
- 应用于Android系统
- 不能称作Java虚拟机,因为它没有遵循Java虚拟机规范并且指令集架构也不同
- 不能直接运行.class文件,执行.dex文件
- 基于寄存器架构,不是JVM的栈式架构
- .dex是编译完成的文件,因此执行效率高
- .dev文件可以通过.class文件转化而来
- ART VM
- Android 5.0替换Dalvik VM
- 支持提前编译AOT(Ahead of Time Compilation)
- 应用于Android系统
- 不能称作Java虚拟机,因为它没有遵循Java虚拟机规范并且指令集架构也不同
- Graal VM
- Graal VM是跨语言全栈虚拟机
- 口号:“run programs faster anywhere”
- 支持各种语言,包括 Java、Scala、C、C++、JavaScript、Ruby、Python等
- 直接跨语言接口调用和对象使用,比如,Java可以使用Python接口和对象
- JVM是跨语言的平台
- 口号:“write once, run anywhere”
- 输入规范
- Graal VM的输入也有规范,由Truffle工具集构建的某语言解释器满足
- 传统JVM的输入必须是符合JVM规范的.class文件
- 工作原理
- 将某种语言的源代码或中间代码(源代码编译后的结果)通过解释器转化为中间表示(能被Graal VM接受的中间表示)
- 提供Truffle工具集可以快速构建新语言的解释器(某语言源代码或中间代码-解释-》Graal VM输入)
- 提供即时编译优化,获得比某语言原生编译器更优秀的执行效率
虚拟机
- 虚拟机 分为系统虚拟机和程序虚拟机
- 系统虚拟机:是对物理计算机的仿真;visual box和VMware就属于系统虚拟机
- 程序虚拟机:专门为执行单个计算机程序而设计;JVM就属于程序虚拟机
机器码-中间码/字节码-指令-指令集-汇编-高级语言
机器码/机器语言
- 机器码是二进制编码,是01序列 表示的指令
- 机器码能够被计算机直接理解,与人类语言相差巨大
- 机器码与硬件平台(CPU)高度耦合
- 不同硬件平台(CPU)具有不同机器码
字节码
- .class文件,中间码
- 中间状态的二进制代码,从机器码向上抽象成中间码/字节码
- 为了实现跨平台,与特点硬件平台解耦
- .java文件-编译-》.class文件-JVM-》机器码
指令
- 由于机器码的可读性太差而出现了指令
- 把特定功能 机器码/特定01序列 固定为指令。例如,mov, inc等
- 不同硬件平台(CPU)具有不同机器码》不同硬件平台(CPU)具有不同指令
指令集
- 指令构成的集合
- 不同硬件平台(CPU)具有不同机器码》不同硬件平台(CPU)具有不同指令》不同硬件平台(CPU)具有不同指令集
- 常见:x86指令集 对应 x86架构的平台;ARM指令集 对应 ARM架构的平台
汇编语言
- 由于指令的可读性太差出现了汇编语言
- 操作码助记符:助记符代替指令的操作码
- 操作数助记符:地址符号或标号代替指令或操作数的地址
- 不同硬件平台(CPU)具有不同机器码》不同硬件平台(CPU)具有不同指令》不同硬件平台(CPU)具有不同指令集》不同硬件平台(CPU)可能具有不同汇编语言(同一厂商的硬件平台一般具有同一汇编语言)
- 汇编语言-汇编过程-》特定硬件平台指令集
高级语言
- 由于汇编的可读性太差出现了高级语言
- 高级语言》解释/编译》汇编语言》机器指令
指令集架构模型
指令集架构模型 | 典型应用 | 特点 | n地址指令 | 对齐方式 |
---|
基于寄存器的指令集架构 | x86指令集 | 依赖于寄存器,可移植性差,性能优秀执行高效 | 一般,都是一地址指令,二地址指令,三地址指令为主 | 16位对齐 | 基于栈的指令集架构 | JVM | 栈结构实现简单不需要特定硬件支持,可移植性好,适用于资源受限的系统(开始Java程序就是为了运行在机顶盒上)。 | 使用零地址指令分配方式(栈顶),避开了寄存器的分配难题。 | 8位对齐 |
对比
- 单个指令大小:基于栈的指令集模型<基于寄存器指令集模型
- 同样操作所需指令数量:基于栈的指令集模型>基于寄存器指令集模型
JVM-JRE-JDK
JVM特点
- JVM是跨语言的平台
- 口号:“write once, run anywhere”
- 自动内存管理
- 自动垃圾回收
JVM整体结构
Java代码执行流程
简介 详解
- 编程器一般分为前端,中端,后端
- javac是前端编译器
- JIT(即时编译器)是后端编译器
JVM生命周期
生命周期:
- 引导类加载器(bootstrap class loader)》创建初始类对象(initial class)》启动JVM》执行java程序》执行Java程序完毕,停止JVM
- Java程序由JVM进程负责执行
虚拟机退出方式 - 自动正常退出:Java程序执行完毕正常退出
- 自动异常终止:Java程序执行过程中遇到内部外部异常或错误(Java程序异常,操作系统异常)
- 主动退出:调用exit()方法,halt()方法
参考书目
- 参考Oracle公司发布的《The Java Virtual Machine Specification》
作者声明
|