JVM前置知识
1.JVM是一个字节码指令执行引擎
1)类似计算机的cpu,cpu就是机器指令的执行引擎
2)注意:JVM是编译后的class文件指令的执行引擎,而不是java文件源程序的执行引擎
3)所以,JVM可以服务于Java以外的编程语言,只要编程语言编译出来的指令文件符合字节码指令规范
2.CPU和JVM的关系
1)CPU是机器指令的执行引擎
2)JVM是C语言写的,JVM也可以理解为C程序,其运行之前需要编译成机器指令
3)启动JVM,就可理解为CPU执行机器指令(JVM编译后的机器指令)
3.机器指令和字节码指令的关系
1)机器指令是CPU解释和执行
2)字节码指令是JVM解释和执行
3)JVM解释的方式:把每一个字节码指令映射成一组机器指令
3.JVM如何执行字节码指令
1)在CPU按顺序执行机器指令时,每次执行前都会记录当前指令到CS:IP寄存器
2)但执行到某条机器指令时,指令作用是修改CS:IP寄存器的值,则CPU跳到另一段机器指令去执行(JVM运行字节码指令的关键)
3)JVM编译之后就是机器指令,启动JVM,就是CPU执行JVM编译过后的机器指令
4)启动的JVM能执行相应的脚本命令,例如字节码运行脚本:java Test.class(JVM执行字节码指令的入口)
5)JVM会把字节码二进制文件加载到内存(永久区)当中,构造出一个可管理的数据结构
6)然后在这个数据结构里面定位出main函数,然后解释和执行函数内的字节码指令
7)解释过程中:会把字节码指令进行映射,把每一个字节码指令映射出预设置好的一组机器指令
8)执行过程中:定位出相应的机器指令后,JVM就会修改CS:IP寄存器的值,使其指向那一组机器指令的首地址
9)这时候涉及到一个CPU的执行跳转:JVM编译后的机器指令–》一个字节码指令对应的一组机器指令
JVM的核心概念
1.字节码规范(描述类的文件)
1)魔数(校验)
2)JDK大小版本号
3)常量池个数,常量池数组
4)父类
5)当前类
6)类限定符(public)
7)接口个数,接口数组
8)属性个数,属性数组
9)Method:方法的元信息,Methods_count:方法个数,Methods:方法元数组
10)Attribute:方法运行环境描述符+方法具体指令集,Attributes_count:Attribute个数,Attributes:Attribute数组
2.Method和Attribute的关系
1)Method主要组成:方法限定符(public),方法名,入参出参描述信息,Attribute(方法运行环境描述符+方法具体指令集)
2)Attribute主要组成:max_stack(操作数最大栈空间),max_locals(局部变量数目),code(具体方法字节码指令集)等
3)Method是方法的描述信息,Attribute是方法运行环境描述符+方法具体指令集
3.JVM描述字节码元素的方式
1)字节码规范指class文件元素组成成分,例如常量池就是class文件其中一个元素
2)当class文件元素保存在硬盘文件时,元素的含义是以二进制的数字来表达的
3)JVM把文件读到内存时,所有二进制含义的元素会被转换成程序定义相应的数据结构
4)例如:ConstantPoolOop(常量池)就是JVM描述class二进制文件中常量池元素的数据结构
4.JVM描述Java类文件的方式
1)我们知道一个Java类文件,编译后就是一个class字节码文件
2)与其说是JVM描述Java类文件,不如说是描述class字节码文件
3)JVM把class字节码文件构造成一个klass类型的数据结构(包含属性和方法的描述信息)
5.JVM建立的三维模型
1)潜在的联系:虚拟机栈中的引用,堆中的对象,永久区的类结构(klass类型的数据结构)
2)上述中的三个概念,JVM建立了一个三维模型(handle,oop,klass)来描述这个潜在的联系
3)例子:Student stu = new Student();
4)handle就是stu,handle具有oop的引用
5)oop是new指令创建的内存指针,指向new出来的对象内存空间,内存空间具有klass引用
6)klass就是Student字节码