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类的完整的生命周期会经历
加载:查找并加载类的二进制数据
连接:
–验证:确保被加载的类的正确性
–准备:为类的静态变量分配内存,并将其初始化为默认值
–解析:把类中的符号引用转换为直接引用
初始化:
为类的静态变量赋予正确的初始值
使用、和卸载五个阶段
加载.class文件的方式
1、从本地系统中直接加载
2、通过网络下载.class文件
3、从zip,jar等归档文件中加载.class文件
4、从专有数据库中提取.class文件
5、将Java源文件动态编译为.class文件
结论:
1、类的加载的最终产品是位于堆区中的Class对象
2、Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
运行数据区域可以划分为6大块:Java栈、程序计数寄存器(PC寄存器)、本地方法栈(Native Method Stack)、Java堆、方法区域、运行常量池(Runtime Constant Pool)。运行常量池本应该属于方法区,但是由于其重要性,JVM规范将其独立出来说明。其中,前面3各区域(PC寄存器、Java栈、本地方法栈)是每个线程独自拥有的,后三者则是整个JVM实例中的所有线程共有的。这六大块如下图所示:
Jvm实例: 对应一个运行的程序,是进程级别的
Jvm执行引擎实例:对应一个线程