JVM系列一(入门)
2020-08-31 本文已影响0人
叛逆与成功
Java虚拟机(JVM)系列一
虚拟机与Java虚拟机 JVM(Java Virtual Machine)
学习视频: (https://www.bilibili.com/video/av83622425?p=9)
一. 课前准备
1.概念
- 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。大体上可以分为程序虚拟机 和 软件虚拟机
2.Java虚拟机
- Java虚拟机本质上是一个程序,它是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。除了Java语言,其他语言只要最终能编译成符合规范的字节码文件,都可以被运行,所以它也被称为跨语言的平台。
- Java平台上的多语言混合编程正成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的需求的一个方向。
它具有以下几个特点 - 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
3. 准备
- Java规范和JVM规范文档(官网下载,JDK11是长期稳定保持的一个版本)
- Jclasslib_window (Java代码查看工具)
- Memory Analyzer Tool (1.9 内存分析工具)
- PXBinaryViewerSetup (查看和编辑二进制文件)
4.Java虚拟机类型
- Sun Classic VM(只提供解释器,JDK1.4被完成淘汰)
- Exact VM(准确式内存管理 ,可以准确知道内存中某个位置的数据类型, 具有现在虚拟机的雏形)
- HotSpot VM(商用)
热点代码探测技术,通过计数器找出最具编译价值的代码,触发即时编译或栈上替换
编译器和解释器协同工作,在最优程序响应时间和执行性能中取得平衡 - JRockit(商用)
专注于服务器端应用,不太关注程序启动速度,内部不包含解释器
世界上最快的JVM - J9((商用 IBM 公司的 简称:IT4J)
在其自家的公司产品上运行,速度很快 - Azul VM
- Liquid VM
Azul VM 和 Liquid VM 都是与特定硬件绑定的虚拟机、软硬件配合的虚拟机,是虚拟机中的战斗机 - Apache Harmony
- Microsoft JVM
- Taobao JVM(off-heap)
- Graal VM(2018年公开的 跨语言的全栈虚拟机)
二.JVM整体架构(以 HotSpot VM 为例)
JVM整体架构.png- 类加载器子系统将class文件加载到内存中,生成一个大的class实例
- 方法区和堆是多线程共享
- java栈、本地方法栈和程序计数器是每个线程独有一份
- 执行引擎主要是将指令翻译成机器语言
三.Java代码执行流程
java代码执行流程.png- 1.Java编辑器将Java代码编译成字节码(.class)文件,在编译过程中,任何一个节点失败都会造成编译失败
- 2.JVM使用类加载器加载class文件
- 类加载之后,进行字节码校验,字节码校验之后JVM解释器会将字节码翻译成机器码交由操作系统完成
- 4.但不是所有的代码都是解释执行的,JVM对此做了优化,如Hotspot 中的即时编译JIT(Just In Time)
四.Java架构模型
Java编译器输入的指令流基本上是基于栈的指令集架构,另一种指令集架构使基于寄存器的指令集架构
1.基于栈的指令集架构
- 设计和实现简单,适用于资源受限的系统
- 避免了寄存器的分配难题:使用零地址指令方式分配,指令多
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集小,编译器容易实现
- 不需要硬件支持,可移植性更好,更好实现跨平台
- 执行性能较比寄存器差
2.基于寄存器的指令集架构
- 典型的是x86的二进制指令集
- 完全依赖于硬件,可移植性差
- 主要以一地址指令、二地址指令和三地址指令为主,指令集大
- 但是其性能优秀,执行高效
- 可以花费更少的指令去完成一项操作
五.JVM生命周期
1.虚拟机启动
JVM的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(init class)来完成,这个类是由虚拟机的具体实现指定的
2.虚拟机执行
执行一个所谓的Java程序时,真正在执行的是一个叫做Java虚拟机的进程
3.虚拟机退出
- 程序正常结束
- 程序遇到异常或错误而异常终止
- 操作系统出现错误
- 某线程调用Runtime类或Sytem类中的exit()或Runtime类中的halt()并且Java安全管理器也允许本次操作