JVM
JVM
字节码
准确的说 任何能在JVM平台上执行的字节码格式都是一样的 所以应该统称为jvm字节码
虚拟机
所谓虚拟机 就是一台虚拟的计算机 是一款软件 用来执行一系列虚拟机计算机指令 大体上可分为
系统虚拟机
和 程序虚拟机
Java虚拟机
是一台执行 java字节码的虚拟计算机 java技术的核心就是java虚拟机
HotSpot
JRocket
J9
三大虚拟机
Java虚拟机就是二进制字节码的运行环境
特点:
- 一次编译 到处运行
- 自动内存管理
- 自动垃圾回收机制
jvm是运行在操作系统之上的 它与硬件没有直接的交互
JVM的整体结构
HotSpot VM
是目前市面上高性能虚拟机的代表作之一
它采用 解释器和即时编译器 并存的架构
方法区 和 堆 多线程共享
栈 本地方法栈 程序计数器 每个线程独享一份
执行引擎 (3部分) : 解释器(JIT编译器 ) 即时编译器 垃圾回收器
负责 将高级语言 翻译成 机器语言
第一次编译成字节码文件 第二次在JIT编译成机器指令
JVM的架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构 另外一种指令集架构是基于寄存器的指令集架构
基于栈特点(跨平台性 指令集小 指令多 执行性能较差)
- 设计和实现简单 适用于资源受限的系统
- 避开了 寄存器的分配难题 使用零地址指令方式分配
- 指令流中的指令大部分是零地址指令 其执行过程依赖于操作栈 指令集更小 编译器容易实现
- 不需要硬件支持 可移植性更好 更好实现跨平台
基于寄存器
- 典型的应用是x86的二进制 指令集 传统的pc和Android的 daclik
- 指令集架构则完全依赖硬件 可移植性差
- 性能优秀执行高效
- 花费更少的指令 去完成一项操作
- 在大部分情况下 基于寄存器架构的指令集 都 以 一地址指令 二地址指令 三地址指令 而基于栈式结构的指令集为零地址指令为主
举例: 同样执行2+3这种逻辑操作
反编译指令 javap -v 字节码文件名
jps: 查询执行中的进程
JVM的生命周期
虚拟机的启动
java虚拟机的启动是通过引导类加载器创建一个初始类来完成的 这个类 是由虚拟机具体实现指定的
(就像你想吃苹果 却发现连苹果树都没有)
虚拟机的执行
- 一个运行中的java虚拟机有一个清晰的任务 :执行java程序
- 程序开始执行时候他才运行 程序结束时 他就停止
- 执行一个所谓的java程序的时候 真真正正在执行的是一个叫java虚拟机的进程
虚拟机退出
- 程序正常执行结束
- 程序在执行过程遇到了异常或者错误
- 由于操作系统出现错误 虚拟机进程终止
- 某线程调用 runtime类或者system类的exit方法 或者runtime类的halt方法 并且java安全管理器也允许这次操作
- 除此 JNI规范描述了用JNI Invocation API(本地方法接口)来加载或卸载虚拟机的退出情况
JVM发展进程
sun Classic VM
第一个商用的java虚拟机 jdk1.4淘汰
- 虚拟机内部只提供了 解释器(程序运行 只使用JIT或者解释器 其中之一就可以 只使用解释器 执行效率是比较低下的)
- **JIT编译器(**热点代码 即时编译成本地机器指令 存起来 缓存) 需要外挂 但是一旦使用 JIT就会接管 解释器就不再工作
解释器类似于步行
JIT类似于公交车
应该搭配使用
Exact VM
jdk1.2 提供
- 准确式内存管理 Exact Memory Management
- 虚拟机可以知道内存中某个位置的数据具体是什么类型的
- 具备现代高性能虚拟机的雏形
- 热点探测
- 编译器和解释器 混合工作模式
- 只在solaris平台短暂使用 终被hotSpot替代
HotSpot VM
最初 由一家名为”Longview Technologies”的小公司设计
- 97年 sun收购 ;09年 sun公司被甲骨文收购
- 1.3时候 HotSpot Vm成为默认虚拟机
其他两个虚拟机都没有方法区的概念
从服务器 桌面到移动端 嵌入式都有应用
热点探测技术
通过计数器找到最具编译价值代码 触发即时编译或栈上替换
解释器和编译器协同操作 在最优化程序响应时间和最佳执行性能中取得平衡
解释器主要负责响应时间 编译器负责执行性能
JRocket BEA公司
- 专注于服务器端
- 不太关注 程序启动速度 不包含解析器实现 全部代码 都靠即时编译器执行
- 大量行业数据显示 JRocket JVM是世界上最快的JVM
- 全面的java运行时解决方案
- 08年被oracle收购
IBM J9
- 市场定位和Hotspot接近
- 多端多用途
KVM和CDC/CLDC HotSpot
- javaMe 产品线上的两款虚拟机 CDC/CLDC HotSpot和 Implement VM
- KVM是 CLDC-HI早期
- 目前移动领域地位 尴尬 智能手机被 Android和iOS二分天下
- KVM简单 轻量 高度可移植 更低端设备 智能控制器 传感器 老人机 经济欠发达地区