Java虚拟机学习

时间:2021-09-21 11:12:18

Java虚拟机

Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。下面我们就来看一下这几部分比较重要的java虚拟机的结构

JVM寄存器

JVM只设置了4个最为常用的寄存器。它们是:

pc程序计数器,用于记录程序的执行。

optop操作数栈顶指针 ,记录指向Java栈区的指针。

frame当前执行环境指针, 记录指向Java栈区的指针。

vars指向当前执行环境中第一个局部变量的指针,记录指向Java栈区的指针。

所有寄存器均为32位。

JVM栈结构,java虚拟机栈

Java栈是JVM存储信息的主要方法。

代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。

是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。

栈框架包括以下三类信息:

局部变量

局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。

每个Java方法使用一个固定大小的局部变量集。

执行环境

执行环境用于保存解释器对Java字节码进行解释过程中所需的信息:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。

执行环境是一个执行一个方法的控制中心。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。

操作数栈

用于存储运算所需操作数及运算的结果。

JVM

Java类的实例所需的存储空间是在堆上分配的。解释器负责分配,记录,回收、。

用于存放类的对象实例。

JVM存储区

JVM有两类存储区:常量缓冲池和方法区。

常量缓冲池用于存储类名称、方法和字段名称以及串常量。

方法区。java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域

方法区则用于存储Java方法的字节码



Java虚拟机的体系结构

                                                                 Java虚拟机学习


类的生命周期

一个java类的完整的生命周期会经历

加载:查找并加载类的二进制数据 

连接:

   –验证:确保被加载的类的正确性 

    –准备:为类的静态变量分配内存,并将其初始化为默认值 

    –解析:把类中的符号引用转换为直接引用 

初始化:

为类的静态变量赋予正确的初始值

使用、和卸载五个阶段

加载.class文件的方式 

1从本地系统中直接加载 

2通过网络下载.class文件 

3从zip,jar等归档文件中加载.class文件 

4从专有数据库中提取.class文件 

5将Java源文件动态编译为.class文件 

结论:

1类的加载的最终产品是位于堆区中的Class对象 

2Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 

Java虚拟机学习

运行数据区域可以划分为6大块:Java栈、程序计数寄存器(PC寄存器)、本地方法栈(Native Method Stack)、Java堆、方法区域、运行常量池(Runtime Constant Pool)。运行常量池本应该属于方法区,但是由于其重要性,JVM规范将其独立出来说明。其中,前面3各区域(PC寄存器、Java栈、本地方法栈)是每个线程独自拥有的,后三者则是整个JVM实例中的所有线程共有的。这六大块如下图所示:


Java虚拟机学习

Java虚拟机学习
Java虚拟机学习


Jvm实例: 对应一个运行的程序,是进程级别的

Jvm执行引擎实例:对应一个线程


Java虚拟机学习