Java-JVM-学习笔记
一、JVM介绍
1、JVM 简介
- JVM是虚拟机的英文简称。它是java运行环境的一部分,是一个虚构出来的计算机,它是通过在实际的计算机上仿真模拟各种计算机功能来实现的
- java编写出来的代码->中间码(字节码)->JVM虚拟机执行->物理机操作系统
2、JVM分类
- 最有影响力的三大商用虚拟机
- HotSpot VM
- BEA JRockit
- IBM J9
2.1 HotSpot VM
- 目前市面上高性能的java虚拟机的代表作品之一。
- 解释器与即时编译器共存
- 栈架构
2.2 Sun Classsic VM
- java的第一款商用虚拟机
- 只提供解释器
- 使用JIT编译器,需要外挂,外挂使用后,解释器便不再工作
2.3 BEA JRockit
- 专业的服务器端应用
- 不包含解释器,初始化时间较长
- 通用型世界上最块的JVM
- 针对延迟敏感型应用
其他
- IBM J9 IBM商用虚拟机()
- Exact VM jdk1.2的虚拟机
- KVM 是CLDC-HI早期产品
- CDC/CLDC Hotspot 目前在更低端的设备上使用,智能控制器、传感器、老人机,欠发达地区手机
- Azul VM (特定硬件平台绑定、软硬件配合专有虚拟机)每个实例至少管理数十个CPU和数百个GPU并提供巨大内存范围内可控的GC时间和垃圾收集器,专有硬件优化的线程调度等优秀特点
- BEA LiquidVm 特定硬件平台绑定、软硬件配合专有虚拟机
- LiquidVM 自己本身实现了一个专有操作系统的必要功能、例如线程调度、文件系统、网络支持等
- Apache Harmony
- Microsoft JVM
- Taobao JVM 基于OpenJDK订制版的阿里jvm
- Dalvik Vm 谷歌开发用于安卓的,只能称为虚拟机,没有遵从java虚拟机规范。寄存器架构
- GRaal VM 跨语言全栈虚拟机,未来取代Hotspot可能性最大。
二、JVM运行的流程
1、整体流程架构,按Hotsopt
2、类装载子系统内容和流程
- 内容
- 流程
3、虚拟机加载器区别
获取ClassLoader的四种方式
- 当前类 clazz.getClassLoader()
- 当前线程 Thread.currentThread().getContextClassLoader()
- 获取系统 ClassLoader.getSystemClassLoader()
- 获取调用者 DirverManger.getCallerClassLoader();
双亲委派机制
- Java类加载机制,用于防止核心类被篡改导致的问题
4、运行时数据区
- 本地方法区
- 程序计数器
- java虚拟机栈
- 堆区
- 元数据区
- JIT CodeCache 编译产物