性能调优专题-基础-0、JVM架构
1. 是什么
1.1. 虚拟机
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
- 大名鼎鼎的 Visual Box,Mware 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
- 程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令我们称为 Java 字节码指令。
1.2. Java 虚拟机
Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成。
1.2.1. 作用
Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
1.2.2. 特点
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
1.2.3. 位置
JVM 是运行在操作系统之上的,它与硬件没有直接的交互
1.2.4. 分类
2. JVM 架构
3. 运行流程
3.1. 类加载子系统
类加载子系统通过 启动类加载器、扩展类加载器、应用类加载器 通过双亲委派机制将各自负责的路径下的编译好的.class 文件,经过加载、链接、初始化 3 步,装载到运行时数据区。它的主要功能是查找并验证类文件、完成相关内存空间的分配和属性赋值。分配空间的话,比如加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。属性赋值:静态变量只是在准备阶段赋初始值,在初始化阶段赋定义值;而常量有编译期优化,赋初始值在编译期就已完成,赋定义值在准备阶段完成。
3.2. 运行时数据区
类文件加载到内存之后由运行时数据区来完成数据存储和数据交换。运行时数据区又分为线程共享内存区和线程隔离内存区。线程共享内存区包括方法区和堆区,它们是程序员能够通过编写代码直接操作的内存区,而线程隔离内存区包括栈区、程序计数器和本地方法栈,它们是完全由 JVM 来调度的内存区域。
3.2.1. 方法区
3.2.2. 堆
而堆区呢,主要是用来存储 Java 对象的实例,也就是我们 new 的类都存在堆区。
3.2.3. 栈
栈区是通过线程的方式运行来加载各种方法。
3.2.4. 程序计数器
3.2.5. 本地方法栈
4. 实战经验
5. 参考与感谢
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Taylor!
评论