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. 分类

image.png

2. JVM 架构

第02章_JVM架构-中.jpg

3. 运行流程

3.1. 类加载子系统

类加载子系统通过 启动类加载器扩展类加载器应用类加载器 通过双亲委派机制将各自负责的路径下的编译好的.class 文件,经过加载、链接、初始化 3 步,装载到运行时数据区。它的主要功能是查找并验证类文件、完成相关内存空间的分配和属性赋值。分配空间的话,比如加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。属性赋值:静态变量只是在准备阶段赋初始值,在初始化阶段赋定义值;而常量有编译期优化,赋初始值在编译期就已完成,赋定义值在准备阶段完成。

3.2. 运行时数据区

类文件加载到内存之后由运行时数据区来完成数据存储和数据交换。运行时数据区又分为线程共享内存区和线程隔离内存区。线程共享内存区包括方法区和堆区,它们是程序员能够通过编写代码直接操作的内存区,而线程隔离内存区包括栈区、程序计数器和本地方法栈,它们是完全由 JVM 来调度的内存区域。

3.2.1. 方法区

image.png
image.png

3.2.2. 堆

而堆区呢,主要是用来存储 Java 对象的实例,也就是我们 new 的类都存在堆区。

3.2.3. 栈

栈区是通过线程的方式运行来加载各种方法。

3.2.4. 程序计数器

3.2.5. 本地方法栈

4. 实战经验

5. 参考与感谢